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
语句。
有没有其他方法可以实现它?
谢谢!
答案 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