Passando sinalizador dinamicamente para xargs

Passando sinalizador dinamicamente para xargs

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 xargsnã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, xargsinterpreta-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 xargssem 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

informação relacionada