Bash `猫<;| perl |成功

Bash `猫<;| perl |成功,bash,Bash,我有一个makefile,它在应该失败的地方成功,因为这样的一行 ./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE 为什么第一个失败了而第二个成功了?第二个成功是因为perl成功了。管道的退出代码是管道中最后一个命令的退出代码。在本例中,它是perl。它接收空输入,不做任何处理,因此它应该以0退出 另一个例子是,这也是成功的: $ a | b | perl && echo ok || echo no -bas

我有一个makefile,它在应该失败的地方成功,因为这样的一行

 ./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE

为什么第一个失败了而第二个成功了?

第二个成功是因为
perl
成功了。管道的退出代码是管道中最后一个命令的退出代码。在本例中,它是
perl
。它接收空输入,不做任何处理,因此它应该以0退出

另一个例子是,这也是成功的:

$ a | b | perl && echo ok || echo no
-bash: a: command not found
-bash: b: command not found
ok
如果您不想在
PARTIAL\u SOURCE
准备就绪之前执行
perl
, 您需要在管道安装之前对其进行测试:

if [ ! -f "$input" ]; then
    ./preprocess.sh < "$input" | perl >FINAL_SOURCE
fi

明显的跟进,我怎样才能让它失败?你的要求是什么?那么您打算实现什么呢?要求编写
FINAL\u SOURCE
,当且仅当生成它的整个命令链成功时。您的要求实际上相当模糊。
preprocess.sh
读取
PARTIAL\u SOURCE
,只有在上一个命令成功时,才将
perl
命令的输出传输到
FINAL\u SOURCE
(不确定文件或变量)?
if [ ! -f "$input" ]; then
    ./preprocess.sh < "$input" | perl >FINAL_SOURCE
fi
while [ ! -f "$input" ]; do sleep 1; done