Динамическая передача флага в 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"to xargsне начинается с 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

Связанный контент