Wenn xargs keine Eingabe gegeben wird, lassen Sie xargs das Dienstprogramm nicht ausführen

Wenn xargs keine Eingabe gegeben wird, lassen Sie xargs das Dienstprogramm nicht ausführen

Ich habe diesen Befehl:

docker volume ls -qf dangling=true | xargs docker volume rm

Ich bekomme Folgendes:

"docker volume rm" requires at least 1 argument.
See 'docker volume rm --help'.

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]

Ich nehme an, es liegt daran, dass es keine Eingabe gab xargs(weil der Befehl keine passenden Volumes zurückgegeben hat docker). Wie kann ich xargsdas tun?Nichtswenn es keine Eingabe erhält?

Antwort1

Sie suchen nach der -rOption. Dies ist eine nicht standardmäßige Option, die möglicherweise auf Ihrem System implementiert ist (lesen Sie in Ihrem xargsHandbuch nach).

Aus dem GNU- xargsHandbuch:

-r,--no-run-if-empty

Wenn die Standardeingabe keine Nichtleerzeichen enthält, führen Sie den Befehl nicht aus. Normalerweise wird der Befehl einmal ausgeführt, auch wenn keine Eingabe vorhanden ist. Diese Option ist eine GNU-Erweiterung.

Aus dem Handbuch zu einem OpenBSD-System:

-r

Führen Sie den Befehl nicht aus, wenn keine Argumente vorhanden sind. Normalerweise wird der Befehl mindestens einmal ausgeführt, auch wenn keine Argumente vorhanden sind.

Unter FreeBSD und macOS ist dies das Standardverhalten. FreeBSD bietet die -rOption zur Kompatibilität mit GNU xargs, macOS hingegen nicht.

xargsUnter AIX und Solaris gibt es keine -rOption und es ist nicht bekannt, wie das Standardverhalten unter AIX ist (ich habe keinen Zugriff auf ein AIX-System). Solaris führt das Dienstprogramm standardmäßig mindestens einmal aus.


Ein portabler Workaround auf Systemen ohne -rFlag für xargs(und wo das einmalige Ausführen des Dienstprogramms das Standardverhalten ist, wie unter Solaris) ist die Verwendung

something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh

(oder etwas Ähnliches; beachten Sie, dass das Anhängen sherforderlich ist), wobei es utilitysich um das Dienstprogramm handelt, das Sie ausführen möchten xargs, und wobei somethingeinige Argumente erzeugt werden.

Das kurze Shell-Skript [ "$#" -gt 0 ] && utility "$@"prüft, ob ihm Argumente übergeben wurden, und führt das Dienstprogramm ggf. mit diesen Argumenten aus.

verwandte Informationen