`cat <does_not_exist | =“”perl` =“”succeeded =“”

时间:2016-12-22 09:02:31

标签: bash

=“”

我有一个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

为什么第一次失败但第二次失败?

1 个答案:

答案 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