Se nenhuma entrada for fornecida ao xargs, não deixe o xargs executar o utilitário

Se nenhuma entrada for fornecida ao xargs, não deixe o xargs executar o utilitário

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 dockercomando). Como posso dizer xargspara fazernadaquando não recebe nenhuma entrada?

Responder1

Você está procurando a -ropção. Esta é uma opção não padrão que pode ser implementada em seu sistema (verifique seu xargsmanual).

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 -ropção de compatibilidade com GNU xargs, enquanto o macOS não.

xargsno AIX e Solaris não tem uma -ropçã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 -rsinalizador 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 utilityestá o utilitário com o qual você gostaria de executar xargse where somethingproduz 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.

informação relacionada