
У меня есть это:
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