我希望我的Shell脚本每执行一个命令失败就会失败。
通常,我这样做的方法是:
set -e
set -o pipefail
(通常我set -u
也添加)
关键是上述方法都不能用于流程替换。这段代码显示“ ok”,并以返回代码= 0退出,但我希望它失败:
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
除了流程替代之外,还有什么等同于“ pipefail”的东西?还有其他方法可以将命令的输出作为文件传递给命令,但是每当这些程序出现故障时都会引发错误?
穷人的解决方案是检测那些命令是否写入stderr(但在成功的情况下某些命令写入stderr)。
另一个与posix兼容的解决方案将使用命名管道,但是我需要放宽这些命令的使用过程,因为oneliners是由编译后的代码动态构建的,而创建命名管道会使事情复杂化(额外的命令,捕获错误,删除它们,等等)
$$
替换对我不起作用,因为该命令替换未完成,因为使用进程替换的命令是在从“非shell”代码(python)生成的命令管道中完成的。可能我应该在python中创建子进程,并以编程方式将它们传递给管道。
kill -2 0
。
mkfifo pipe; { rm pipe; cat <file; } >pipe
。该命令将挂起,直到一个阅读器打开pipe
,因为它是做的外壳open()
,因此只要有一个读者pipe
的FS链接以pipe
ISrm
“d,然后cat
拷贝INFILE出到外壳的描述为管。而且无论如何,如果您想从流程子中传播错误,请执行: <( ! : || kill -2 "$$")