
У меня есть такая команда:
docker volume ls -qf dangling=true | xargs docker volume rm
Я понимаю это:
"docker volume rm" requires at least 1 argument. See 'docker volume rm --help'. Usage: docker volume rm [OPTIONS] VOLUME [VOLUME...]
Я предполагаю, что это потому, что не было ввода xargs
(потому что не было соответствующих томов, возвращенных командой docker
). Как я могу сказать, xargs
что делатьничегокогда он не получает никаких входных данных?
решение1
Вы ищете -r
опцию. Это нестандартная опция, которая может быть реализована в вашей системе (проверьте руководство xargs
).
Из руководства GNU xargs
:
-r
,--no-run-if-empty
Если стандартный ввод не содержит непустых символов, не запускайте команду. Обычно команда запускается один раз, даже если нет ввода. Эта опция является расширением GNU.
Из руководства по системе OpenBSD:
-r
Не запускайте команду, если нет аргументов. Обычно команда выполняется хотя бы один раз, даже если нет аргументов.
В FreeBSD и macOS это поведение по умолчанию. FreeBSD имеет -r
возможность совместимости с GNU xargs
, а macOS — нет.
xargs
на AIX и Solaris нет опции -r
, и неизвестно, каково поведение по умолчанию на AIX (у меня нет доступа к системе AIX). Solaris по умолчанию запустит утилиту по крайней мере один раз.
Одним из переносимых обходных путей на системах без -r
флага xargs
(и где запуск утилиты один раз является поведением по умолчанию, как в Solaris) является использование
something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh
(или что-то в этом роде; обратите внимание, что завершающий символ sh
обязателен) где utility
— утилита, которую вы хотите запустить xargs
, а где something
выдает некоторые аргументы.
Короткий скрипт оболочки [ "$#" -gt 0 ] && utility "$@"
проверяет, были ли ему переданы какие-либо аргументы, и если да, то запускает утилиту с этими аргументами.