我有这个:
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