web-dev-qa-db-ja.com

xargsへの入力がない場合は、xargsにユーティリティを実行させないでください。

私はこのコマンドを持っています:

docker volume ls -qf dangling=true | xargs docker volume rm

私はこれを手に入れます:

"docker volume rm" requires at least 1 argument.
See 'docker volume rm --help'.

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]

xargsへの入力がなかったためだと思います(dockerコマンドによって返された一致するボリュームがなかったため)。入力を受け取らない場合、xargsnothingを実行するように指示するにはどうすればよいですか?

6
Alexander Mills

-rオプションを探しています。これは、しばしば実装される非標準オプションです(xargsマニュアルを確認してください)。

GNU xargsマニュアルから:

-r--no-run-if-empty

標準入力に非ブランクが含まれていない場合は、コマンドを実行しないでください。通常、コマンドは入力がない場合でも1回実行されます。このオプションはGNU拡張です。

OpenBSDシステムのマニュアルから:

-r

引数がない場合は、コマンドを実行しないでください。通常、引数がない場合でも、コマンドは少なくとも1回は実行されます。

FreeBSDとmacOSでは、これがデフォルトの動作です。 AIXおよびSolarisのxargsには-rオプションがなく、デフォルトの動作は不明です(AIXまたはSolarisシステムにアクセスできません)。


xargs-rフラグがないシステムでの回避策の1つ(および、ユーティリティを東で1回実行することがデフォルトの動作)は、

something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh

(またはそのようなもの。末尾のshが必要であることに注意してください)ここで、utilityxargsで実行するユーティリティであり、somethingはいくつかの引数を生成します。

短いシェルスクリプト[ "$#" -gt 0 ] && utility "$@"は、引数が指定されているかどうかをテストし、指定されている場合は、それらの引数を使用してユーティリティを実行します。

10
Kusalananda