
の逆を実行して、xargs --no-run-if-empty
stdin が空の場合にのみ実行されるようにしたいと思います。
使用例:
ip a | fgrep "inet " | grep -ve " tun" -e " lo"
# pipe it into something and echo localhost if empty
答え1
この場合、grep
何も見つからない場合 (出力がない場合) はエラー コードを返します。したがって、stdout を確認する必要はありません。代わりに、エラー コードを確認できます。は||
これを実行し、前のコマンドが失敗した場合にのみ次のコマンドを実行します。
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
ストリームが空でない場合はストリームを消費しません (これが必要なのかどうかは不明です)。
text の代替は です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