
Eu tenho este comando:
docker volume ls -qf dangling=true | xargs docker volume rm
Eu entendi isso:
"docker volume rm" requires at least 1 argument. See 'docker volume rm --help'. Usage: docker volume rm [OPTIONS] VOLUME [VOLUME...]
Presumo que seja porque não houve entrada xargs
(porque não houve volumes correspondentes retornados pelo docker
comando). Como posso dizer xargs
para fazernadaquando não recebe nenhuma entrada?
Responder1
Você está procurando a -r
opção. Esta é uma opção não padrão que pode ser implementada em seu sistema (verifique seu xargs
manual).
Do manual GNU xargs
:
-r
,--no-run-if-empty
Se a entrada padrão não contiver espaços em branco, não execute o comando. Normalmente, o comando é executado uma vez, mesmo que não haja entrada. Esta opção é uma extensão GNU.
Do manual em um sistema OpenBSD:
-r
Não execute o comando se não houver argumentos. Normalmente o comando é executado pelo menos uma vez, mesmo que não haja argumentos.
No FreeBSD e no macOS, este é o comportamento padrão. O FreeBSD tem a -r
opção de compatibilidade com GNU xargs
, enquanto o macOS não.
xargs
no AIX e Solaris não tem uma -r
opção e não se sabe qual é o comportamento padrão no AIX (não tenho acesso a um sistema AIX). O Solaris executará o utilitário pelo menos uma vez por padrão.
Uma solução portátil em sistemas sem -r
sinalizador para xargs
(e onde executar o utilitário no leste uma vez é o comportamento padrão, como no Solaris) é usar
something | xargs sh -c '[ "$#" -gt 0 ] && utility "$@"' sh
(ou algo parecido; observe que o final sh
é obrigatório) where utility
está o utilitário com o qual você gostaria de executar xargs
e where something
produz alguns argumentos.
O script de shell curto [ "$#" -gt 0 ] && utility "$@"
testa se recebeu algum argumento e, em caso afirmativo, executa o utilitário com esses argumentos.