/bin/sh
puede estar bash
en su sistema, pero cuando se invoca como sh
, bash
se ejecutará en modo POSIX (como si POSIXLY_CORRECT
estuviera definido o se inició con --posix
).
En este modo, las sustituciones de proceso no existen.
Soluciones:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
Alternativa:
all:
bash -c "diff <(command1) <(command2)"
O simplemente defina la variable Makefile SHELL
como /bin/bash
:
SHELL=/bin/bash
Si desea portabilidad, elija la primera solución. Si está de acuerdo con una dependencia bash
, elija el segundo. Si además no necesita preocuparse por make
implementaciones que no sean GNU , use la tercera.
Respecto a la configuración SHELL
: el estándar POSIX dice que los ejecutables en Makefiles deben ser invocados con la system()
función de biblioteca C por make
. No se garantiza que esta función use la SHELL
variable de entorno (de hecho, el estándar desaconseja hacerlo). El estándar también llega a cierto punto para decir que establecer la variable Makefile SHELL
no debería afectar la variable de entorno SHELL
. make
Sin embargo, en la mayoría de las implementaciones que conozco, la variable Makefile SHELL
se usará para ejecutar los comandos.
La sugerencia en la justificación de la make
utilidad es utilizar bash -c
:
Se omitió la MAKESHELL
característica histórica y las características relacionadas proporcionadas por otras make
implementaciones. En algunas implementaciones se usa para permitir que un usuario anule el shell que se usará para ejecutar make
comandos. Esto fue confuso; para un portátil make
, el escritor de archivos MAKE debe elegir el shell. Además, un escritor de archivos MAKE no puede requerir que se use un shell alternativo y aún así considera que el archivo MAKE es portátil. Si bien sería posible estandarizar un mecanismo para especificar un shell alternativo, las implementaciones existentes no están de acuerdo con dicho mecanismo, y los escritores de archivos MAKE ya pueden invocar un shell alternativo especificando el nombre del shell en la regla para un objetivo; por ejemplo:
python -c "foo"
bash
en el Makefile o cualquier otra solución al problema de diff sin usar archivos temporales?SHELL
que/bin/bash
en el Makefile.bash -c
.