
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