Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

276
Vistas
Capture el error estándar de Shell en el archivo MAKE

Tengo un problema con la función de shell en los archivos MAKE. Haciendo esto:

 var := $(shell some-command)

Me permite capturar la stdout de some-command .

Haciendo esto:

 var := $(shell some-command 2>&1)

Me permite capturar el stdout y el stderr de some-command .

¿Cómo capturo el stderr del propio shell?

Este archivo MAKE ilustra el problema:

 var1 := $(shell date 2>&1) var2 := $(shell ls aaa 2>&1) var3 := $(shell a-command-which-does-not-exist 2>&1) show-me: @echo var1: \"$(var1)\" @echo var2: \"$(var2)\" @echo var3: \"$(var3)\"

Producirá:

 /bin/sh: 1: a-command-which-does-not-exist: not found var1: "So 6. Feb 00:37:05 CET 2022" var2: "ls: cannot access aaa: No such file or directory" var3: ""

Me gustaría capturar /bin/sh: 1: a-command-which-does-not-exist: not found into var3 . es posible?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Tienes que ejecutarlo en una subcapa:

 var3 := $(shell $(SHELL) -c 'a-command-which-does-not-exist' 2>&1)

Lamentablemente, no hay otra manera.

ETA OK, lo descubrí. El problema es que si el shell invocado por la función $(shell ...) sale con un código de error de 127 (que es el código de salida del shell para cuando no puede encontrar un programa para ejecutar), entonces GNU make explícitamente escribe su salida en stderr en lugar de capturarla (si examinas la function.c:func_shell_base() verás esto).

Cualquier cambio en el shell que invoques que asegure que no salga con el código de salida 127 "solucionará" el problema:

 $ cat Makefile out := $(shell bad-program 2>&1 || exit 1) $(info out = $out) $ make out = /bin/sh: 1: bad-program: not found make: *** No targets. Stop.

Esto podría ser un error en la creación de GNU. Tendré que considerarlo.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda