Если xargs не получает входных данных, не позволяйте xargs запускать утилиту

Если xargs не получает входных данных, не позволяйте xargs запускать утилиту

У меня есть такая команда:

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 "$@"проверяет, были ли ему переданы какие-либо аргументы, и если да, то запускает утилиту с этими аргументами.

Связанный контент