
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 xargs
das tun?Nichtswenn es keine Eingabe erhält?
Antwort1
Sie suchen nach der -r
Option. Dies ist eine nicht standardmäßige Option, die möglicherweise auf Ihrem System implementiert ist (lesen Sie in Ihrem xargs
Handbuch nach).
Aus dem GNU- xargs
Handbuch:
-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 -r
Option zur Kompatibilität mit GNU xargs
, macOS hingegen nicht.
xargs
Unter AIX und Solaris gibt es keine -r
Option 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 -r
Flag 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 sh
erforderlich ist), wobei es utility
sich um das Dienstprogramm handelt, das Sie ausführen möchten xargs
, und wobei something
einige 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.