我有这个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