/bin/sh
可能bash
在您的系统上,但是当以调用时sh
,bash
将以POSIX模式运行(就像POSIXLY_CORRECT
已定义,或以开头--posix
)。
在这种模式下,不存在进程替换。
解决方案:
all:
command1 >file1
command2 >file2
diff file1 file2
rm -f file1 file2
选择:
all:
bash -c "diff <(command1) <(command2)"
或者只是将Makefile变量定义SHELL
为/bin/bash
:
SHELL=/bin/bash
如果您想要可移植性,请选择第一个解决方案。如果可以bash
,请选择第二个。如果您另外不需要关心非GNU make
实现,请使用第三个。
关于设置SHELL
:POSIX标准指出Makefiles中的可执行文件应该用system()
C库函数调用make
。不能保证此函数使用SHELL
环境变量(实际上,标准不建议这样做)。该标准还说,设置Makefile变量SHELL
不应影响环境变量 SHELL
。在make
我所知道的大多数实现中,Makefile变量SHELL
将用于执行命令。
该实用程序的基本原理中make
的建议是使用bash -c
:
省略了历史MAKESHELL
特征以及其他make
实现提供的相关特征。在某些实现中,它用于让用户覆盖要用于运行make
命令的外壳。这令人困惑;对于便携式计算机make
,外壳应由makefile编写器选择。此外,makefile编写器不能要求使用备用shell,而仍然认为makefile可移植。尽管可以规范化指定备用shell的机制,但现有的实现方法在这种机制上并不一致,makefile编写者可以通过在目标规则中指定shell名称来调用备用shell。例如:
python -c "foo"
bash
在不使用临时文件的情况下调用Makefile或其他任何针对diff问题的解决方案?