
Tengo esto:
r_flag=' -r ';
docker ps -aq | xargs "$r_flag" docker rm -v | cat;
y me sale este error en ubuntu:
xargs: -r : No such file or directory
¿porqué es eso? Solo estoy intentando pasar la opción -r a xargs. El problema parece desaparecer si lo cambio de:
r_flag=' -r ';
a
r_flag='-r';
aburrido...! Pero por qué.
Respuesta1
Con r_flag=" -r "
los espacios se incluyen en el valor de la variable. En otras palabras, el argumento "$r_flag"
to xargs
no comienza con a -
y, por lo tanto, no se toma como una opción. El primer carácter de una opción.tieneser un guión.
Como no es una opción, xargs
lo interpreta como el nombre de la utilidad que debería ejecutar. No encuentra la utilidad y se queja.
Forma alternativa de hacer lo correcto:
set -- -r
docker ps -aq | xargs "$@" docker rm -v
O, usando una matriz en bash
,
xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
Esto facilitaría el paso de indicadores adicionales xargs
sin tener que definir nuevas variables:
set -- -r -t
docker ps -aq | xargs "$@" docker rm -v
O, usando una matriz en bash
,
xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
La matriz pasada al comando obviamente podría construirse dinámicamente:
xargs_opts=()
if should_trace; then
xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
xargs_opts+=( -r )
fi