
我想做相反的事情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