フラグをxargsに動的に渡す

フラグをxargsに動的に渡す

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

r_flag=' -r ';

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

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

xargs: -r : No such file or directory

なぜそんなことですか? -rオプションをxargsに渡したいと思います。私がそれを次のように変更した場合:

r_flag=' -r ';

到着

r_flag='-r';

絶え間ない…!しかし、なぜ。

答え1

r_flag=" -r "変数の値にスペースが含まれています。つまり、パラメータは"$r_flag"axargsで始まらないため、-オプションとは見なされません。オプションの最初の文字持つダッシュになります。

オプションではないため、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

関連情報