
私はこれを持っています:
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