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