xargs にフラグを動的に渡す

xargs にフラグを動的に渡す

私はこれを持っています:

r_flag=' -r ';

docker ps -aq  | xargs "$r_flag" docker rm -v | cat;

Ubuntu では次のエラーが発生します:

xargs: -r : No such file or directory

それはなぜでしょうか? xargs に -r オプションを渡そうとしているだけです。次のように変更すると、問題は解決するようです:

r_flag=' -r ';

r_flag='-r';

ダサい…!でもなんで。

答え1

スペースはr_flag=" -r "変数の値に含まれます。言い換えると、 の引数"$r_flag"xargsで始まっていない-ため、オプションとして扱われません。オプションの最初の文字はもっているダッシュになる。

これはオプションではないため、xargs実行する必要があるユーティリティの名前として解釈されます。ユーティリティが見つからないため、エラーが発生します。

正しいことを行う別の方法:

set -- -r
docker ps -aq | xargs "$@" docker rm -v

または、配列を使用してbash

xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

xargsこれにより、新しい変数を定義しなくても、追加のフラグを簡単に渡すことができます。

set -- -r -t
docker ps -aq | xargs "$@" docker rm -v

または、配列を使用してbash

xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v

コマンドに渡される配列は、明らかに動的に構築できます。

xargs_opts=()

if should_trace; then
    xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
    xargs_opts+=( -r )
fi

関連情報