将管道与bash shell脚本中的退出状态相结合

前端之家收集整理的这篇文章主要介绍了将管道与bash shell脚本中的退出状态相结合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个bash shell脚本命令,如果make成功(终止为零退出状态),导致日期运行,反之亦然:
make && date

但现在我想处理其输出,例如

make | sed s/a/A/

如果我做

make | sed s/a/A/ && date

日期运行即使make失败.

如果我反而做

make && date | sed s/a/A/

sed处理日期的输出而不是make.

你会知道任何解决方案吗?谢谢!

附:我试过这些:

(make | sed s/a/A/) && date

当make失败时,日期仍然运行.

(make && (date > /dev/null)) | sed s/a/A/

当成功时,日期不会运行.

如果你有一个具有进程替换的shell(bash,posix shell不是),而不是
make > >(sed s/a/A/) && date

应该做的窍门,除了bash它不等待sed(似乎zsh,但我只是尝试,没有检查的文档),所以输出的日期可以在最后一行sed输出之前.在简单的posix shell中,可以使用更复杂的结构

((make && date >&3) | sed s/a/A/) 3>&1

在sed处理完所有内容之前,日期可以再次运行,所以输出可以再次出现在sed输出的最后一行之前.

如果您希望日期只在sed处理完所有内容之后运行,您唯一的机会就是将make状态存储在某处.就像是:

(make && touch make-succeeded) | sed s/a/A/
rm make-succeeded 2>/dev/null && date

滥用这一事实,如果文件不存在,rm(不带-f)将以非零状态退出,并使用重定向静音它的错误消息.正如Fredrik所提到的那样,bash实际上有一个地方可以存放退出状态,所以在bash中你可以:

make | sed s/a/A/
[ 0 -eq $PIPESTATUS[0] ] && date

猜你在找的Bash相关文章