如果 stdin 为空则运行命令

如果 stdin 为空则运行命令

我想做相反的事情xargs --no-run-if-empty,这样它只在标准输入为空时运行。

使用示例:

ip a | fgrep "inet " | grep -ve " tun" -e " lo"
# pipe it into something and echo localhost if empty

答案1

在这种情况下,grep当找不到任何内容(没有输出)时返回错误代码。因此我们不需要查看它的标准输出。我们可以改为查看错误代码。||将执行此操作,并且仅在先前的命令失败时才运行以下命令。

ip a | fgrep "inet " | grep -ve " tun" -e " lo" || echo localhost

答案2

该软件包moreutils提供了ifne工具。通常ifne运行给定的命令当且仅当标准输入是不是空的。然而,它有一个反向操作模式:

-n

反向操作。如果标准输入为空,则运行该命令。

ifne请注意,如果标准输入不为空,则在这种情况下会传递它。

像这样使用它:

ip a | fgrep "inet " | grep -ve " tun" -e " lo" | ifne -n echo "localhost"

这就是它与其他答案的不同之处:

  • 该解决方案不依赖于任何命令的退出状态;
  • ifne如果流不为空,则不会消耗该流(不清楚这是否是您想要的)。

文本的替代方案是awk '{print} END {if (NR==0) print "localhost"}'.对于非文本数据(就 POSIX 而言:NUL 字符、超出 {LINE_MAX}、不完整的行)awk可能无法按您想要的方式工作。

答案3

您尝试过这样简单的条件吗?

[[ -z $(ip a | fgrep "inet " | grep -ve " tun" -e " lo") ]] && echo localhost

相关内容