如果第一个 bash 命令的输出输出零行,如何执行第二个 bash 命令?

How to execute a second bash command if output of first bash command outputs zero lines?

我想为它创建一个 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 方法在管道中使用时更安全。)