我想为它创建一个crontab条目。因此,解决方案必须是一行,因为我不想编写一个脚本,然后在crontab中调用该脚本(在脚本文件中使用完整的if else,我可以很容易地做到这一点)。
但我想使用一些&&
或||
来实现以下目标:
cmd1 | cmd2 | cmd3 | wc -l != 0? mail -s "Found xyz" ...
如何做到这一点?
试试这个:
test "$(unreadable | long | list | of | commands | in | one | line)" && mail -s ...
如果您只是想知道命令是否产生任何输出,那么计算行数是没有用的。
你可以这样写:
cmd1 | cmd2 | cmd3 | grep '^' >/dev/null && mail -s "Found xyz"
对于&&
,如果至少有一行输出,它将运行最后的命令(mail
)。如果您想在没有任何输出的情况下发送邮件,请使用||
。
解释:如果grep
命令找到任何匹配给定模式的行,则该命令成功。模式^
匹配一行的开头…任何行。因此,如果至少有一行(即使是空白一行),grep '^'
就会成功。>/dev/null
然后丢弃输出。
(您也可以使用grep -q
而不是>/dev/null
,但是grep
将在第一次匹配后退出,这可能会导致早期命令的SIGPIPE错误,并可能出现奇怪的问题。)我认为>/dev/null
方法在管道中使用时更安全。