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

関連情報