2016-12-22 23 views
1

我有成功的,它应该会失败,因为这样的`cat <does_not_exist | perl`成功

./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE 

线成功,即使PARTIAL_SOURCE尚不存在一个makefile。

这不是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

是什么您的要求?你打算做什么? – Inian

+0

当且仅当产生它的全部命令链成功时,要求'FINAL_SOURCE'被写入。 – spraff

+0

您的要求其实很模糊。 'preprocess.sh'从'PARTIAL_SOURCE'中读取,并且只有在前一个命令成功的情况下,才将'perl'命令的输出管道输出到'FINAL_SOURCE'(不确定文件或变量)? – Inian

回答

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 
+0

明显的后续行动,我该如何让它失败? – spraff

+0

@spraff我更新了我的答案 – janos