xargs に入力が与えられない場合は、xargs にユーティリティを実行させないでください

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)。どうすればいいですかxargs何もない入力がない場合はどうなりますか?

答え1

探している-rオプションは非標準オプションですが、システムに実装されている可能性があります (xargsマニュアルを確認してください)。

GNUxargsマニュアルより:

-r--no-run-if-empty

標準入力に空白以外の文字が含まれていない場合は、コマンドを実行しません。通常、入力がない場合でもコマンドは 1 回実行されます。このオプションは GNU 拡張機能です。

OpenBSD システムのマニュアルより:

-r

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

FreeBSD と macOS では、これがデフォルトの動作です。FreeBSD には-rGNU との互換性のためのオプションがありますxargsが、macOS にはありません。

xargsAIX と Solaris にはオプションがなく-r、AIX でのデフォルトの動作は不明です (AIX システムにアクセスできません)。Solaris では、デフォルトでユーティリティが少なくとも 1 回実行されます。


-rフラグのないシステムxargs(Solarisのようにユーティリティを少なくとも1回実行することがデフォルトの動作であるシステム)での1つの移植可能な回避策は、

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

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

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

関連情報