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.

10-06 14:27