动态地将标志传递给 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"toxargs不以 a 开头-,因此不被视为选项。选项的第一个字符成为破折号。

由于它不是一个选项,因此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

相关内容