
Ich habe das:
r_flag=' -r ';
docker ps -aq | xargs "$r_flag" docker rm -v | cat;
und ich bekomme diesen Fehler unter Ubuntu:
xargs: -r : No such file or directory
warum ist das so? Ich versuche nur, die Option -r an xargs zu übergeben. Das Problem scheint zu verschwinden, wenn ich es ändere von:
r_flag=' -r ';
Zu
r_flag='-r';
lahm...! Aber warum.
Antwort1
Bei r_flag=" -r "
werden die Leerzeichen in den Wert der Variablen einbezogen. Mit anderen Worten, das Argument "$r_flag"
beginnt xargs
nicht mit einem -
und wird daher nicht als Option verwendet. Das erste Zeichen einer Optionhatein Strich sein.
Da es keine Option ist, xargs
wird es als Name des Dienstprogramms interpretiert, das ausgeführt werden soll. Das Dienstprogramm kann nicht gefunden werden und es wird eine Fehlermeldung angezeigt.
Alternative Möglichkeit, das Richtige zu tun:
set -- -r
docker ps -aq | xargs "$@" docker rm -v
Oder verwenden Sie ein Array in bash
,
xargs_opts=( -r )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
Dadurch wäre es einfach, zusätzliche Flags zu übergeben, xargs
ohne neue Variablen definieren zu müssen:
set -- -r -t
docker ps -aq | xargs "$@" docker rm -v
Oder verwenden Sie ein Array in bash
,
xargs_opts=( -r -t )
docker ps -aq | xargs "${xargs_opts[@]}" docker rm -v
Das an den Befehl übergebene Array könnte offensichtlich dynamisch erstellt werden:
xargs_opts=()
if should_trace; then
xargs_opts+=( -t )
fi
if should_not_run_on_empty; then
xargs_opts+=( -r )
fi