如果 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

相關內容