
Eu tenho isto:
r_flag=' -r ';
docker ps -aq | xargs "$r_flag" docker rm -v | cat;
e recebo este erro no Ubuntu:
xargs: -r : No such file or directory
por que é que? Estou apenas tentando passar a opção -r para xargs. O problema parece desaparecer se eu mudar de:
r_flag=' -r ';
para
r_flag='-r';
muito ruim...! Mas por que.
Responder1
Com r_flag=" -r "
os espaços estão incluídos no valor da variável. Em outras palavras, o argumento "$r_flag"
to xargs
não começa com a -
e, portanto, não é considerado uma opção. O primeiro caractere de uma opçãotemser um traço.
Como não é uma opção, xargs
interpreta-o como o nome do utilitário que deve ser executado. Ele não consegue encontrar o utilitário e reclama.
Maneira alternativa de fazer a coisa certa:
set -- -r
docker ps -aq | xargs "$@" docker rm -v
Ou, usando uma matriz em bash
,
xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
Isso facilitaria a passagem de sinalizadores adicionais xargs
sem a necessidade de definir novas variáveis:
set -- -r -t
docker ps -aq | xargs "$@" docker rm -v
Ou, usando uma matriz em bash
,
xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
A matriz passada para o comando poderia obviamente ser construída dinamicamente:
xargs_opts=()
if should_trace; then
xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
xargs_opts+=( -r )
fi