shell – 如何将输出从一个进程管道传输到另一个进程但只在第一个进程输出时执行?

如果有来自mailq |的输出,我怎样才能将此命令重写为仅发送电子邮件grep的?

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email

这甚至可以在一条线上吗?

有关比发送电子邮件更常见的情况,请参阅Check if pipe is empty and run a command on the data if it isn’t.

最佳答案
我认为您必须使用临时文件进行此操作,以便您可以使用&&如果grep返回退出状态,表明它具有如下匹配项,则运算符仅运行mail命令:

TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"

如果您不介意临时文件粘贴在某处并且可以使用静态名称,则可以跳过特殊的命名和删除内容:

 mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep

编辑:在看到glenn’s answer之后,我更多地玩了这个,并且显然使用$()语法分配变量返回命令的退出代码,因此您可以跳过他用于字符串长度的测试并使用它.这里只有一个命令:

data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"

编辑2:看到Simon’s answer后,我检查了我的邮件程序.它默认情况下不会按照他描述的方式运行,但确实有一个选项.从手册页:

-E If an outgoing message does not contain any text in its first or only message part, do not send it but discard it silently, effectively setting skipemptybody variable at program startup. This is useful for sending messages from scripts started by cron(8).

使这成为可能:

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email

转载注明原文:shell – 如何将输出从一个进程管道传输到另一个进程但只在第一个进程输出时执行? - 代码日志