命令失败时尽早退出管道

命令失败时尽早退出管道

我在看如果前一个命令失败则退出管道但我正在寻找一个更通用的解决方案来解决这个问题:

chlist -q -v -m -r $sourcelist | \
grep '^USER:' | \
chlist -q -v -f - $superlist

问题是,如果第一个 chlist 失败,那么第二个 chlist 中没有输入确实非常糟糕。

除了将第一个 chlist 的输出放入临时文件然后检查退出状态(例如,根本不使用管道)之外,是否有任何解决方案可以阻止第二个 chlist 运行?

答案1

管道中的所有命令都是异步启动的,因此如果您想确保在没有输入的情况下最后一个命令不会运行,您需要按照您的建议拆分管道。或者也许chlist(我不知道)可以选择为您做到这一点。

答案2

经过更多的尝试后,我想出了下面的想法,我认为这可能是一个可行且非常通用的解决方案:

( rm -f FAIL ; chlist -q -v -m -r $sourcelist || touch FAIL ) | \

( test -e FAIL || chlist -q -v -f - $superlist )

(为了清楚起见,我grep在这里省略了,但这在那里工作得很好)

另一种(更干净?)的变体:

( chlist -q -v -m -r $sourcelist || touch FAIL ) | \

( rm FAIL 2>/dev/null || chlist -q -v -f - $superlist )

答案3

如何在第一个命令的输出中附加一条虚拟行来满足最后一个命令的输入要求但不触发操作?

相关内容