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?
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.