我有一个makefile,它应该在失败的地方成功这样的一行
./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE
即使PARTIAL_SOURCE
尚不存在也会成功。
这不是preprocess.sh
的怪癖,似乎与bash / sh有关
$> cat <does_not_exist && echo ok || echo no
bash: does_not_exist: No such file or directory
no
$> cat <does_not_exist | perl && echo ok || echo no
bash: does_not_exist: No such file or directory
ok
为什么第一次失败但第二次失败?
答案 0 :(得分:2)
第二个成功,因为perl
成功。管道的退出代码是管道中最后一个命令的退出代码。在此示例中,它是perl
。它接收空输入,不执行任何操作,因此它将以0退出。
另一个例子,这也是成功的:
$ a | b | perl && echo ok || echo no
-bash: a: command not found
-bash: b: command not found
ok
如果您不希望在perl
准备好之前执行PARTIAL_SOURCE
,
你需要在管道之前测试它:
if [ ! -f "$input" ]; then
./preprocess.sh < "$input" | perl >FINAL_SOURCE
fi
或者等待输入准备就绪:
while [ ! -f "$input" ]; do sleep 1; done