相当于破折号外壳中的pipefail

时间:2013-07-19 23:34:09

标签: bash posix pipe dash-shell

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语句。

有没有其他方法可以实现它?

谢谢!

3 个答案:

答案 0 :(得分:1)

PIPESTATUS / pipefail的POSIX实现的“stock”答案在comp.unix.shell FAQ Q11

答案 1 :(得分:0)

安装 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

答案 2 :(得分:0)

我遇到了同样的问题,set -o pipefail${PIPESTATUS[0]}的bash选项在我使用的docker映像的破折号外壳(/ bin / sh)中都失败了。我不想修改映像或安装其他软件包,但是好消息是,使用命名管道对我而言是完美的=)

mkfifo named_pipe
tee err < named_pipe &
gcc -Wall $$f.c -o $$f > named_pipe 2>&1
echo $?

有关我在哪里找到信息的信息,请参见以下答案:https://stackoverflow.com/a/1221844/431296