在dash
shell中是否有与pipefail
中的bash
相对应的类似选项?
如果管道中的命令之一失败(但set -e
不会退出该命令),则可以通过其他任何方式获取非零状态。
更清楚地说,这是我要实现的示例:
在示例调试makefile中,我的规则如下所示:
set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi;
基本上,它会在错误发生时打开错误文件和源文件,并在没有错误时运行程序。省了我一些打字。上面的代码片段在
bash
上运行良好,但是我较新的Ubunty系统使用了dash
,但似乎不支持pipefail
选项。如果下面的命令组的第一部分失败,我基本上想要一个FAILURE状态:
gcc -Wall $$f.c -o $$f 2>&1 | tee err
这样我就可以将其用于
if
语句。有其他替代方法可以实现吗?
谢谢!
最佳答案
Q.的样本问题要求:
安装moreutils,然后尝试使用mispipe
util,它返回管道中第一个命令的退出状态:
sudo apt install moreutils
然后:
if mispipe "gcc -Wall $$f.c -o $$f 2>&1" "tee err" ; then \
./$$f
else
vim -o $$f.c err
fi
虽然'mispipe'在这里可以完成工作,但它并不是
bash
shell的pipefail
的完全重复;来自man mispipe
: Note that some shells, notably bash, do offer a
pipefail option, however, that option does not
behave the same since it makes a failure of any
command in the pipeline be returned, not just the
exit status of the first.