加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:31:32 所属栏目:安全 来源:网络整理
导读:我有这个bash shell脚本命令,如果make成功(终止为零退出状态),导致日期运行,反之亦然: make date 但现在我想处理其输出,例如 make | sed s/a/A/ 如果我做 make | sed s/a/A/ date 日期运行即使make失败. 如果我反而做 make date | sed s/a/A/ sed处理日期的
我有这个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读