如果没有输入 xargs,不要让 xargs 运行该实用程序

Ale*_*lls 7 pipe xargs newlines

我有这个命令:

docker volume ls -qf dangling=true | xargs docker volume rm
Run Code Online (Sandbox Code Playgroud)

我明白了:

"docker volume rm" requires at least 1 argument.
See 'docker volume rm --help'.

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]
Run Code Online (Sandbox Code Playgroud)

我认为这是因为没有输入xargs(因为docker命令没有返回匹配的卷)。当它没有收到任何输入时,我怎么能告诉它什么都不xargs做?

Kus*_*nda 16

您正在寻找该-r选项。这是一个非标准选项,可以在您的系统上实现(查看您的xargs手册)。

从 GNUxargs手册:

-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
Run Code Online (Sandbox Code Playgroud)

(或类似的东西;请注意尾随sh是必需的)utility您想要运行的实用程序xargs在哪里,以及在哪里something产生一些参数。

简短的 shell 脚本[ "$#" -gt 0 ] && utility "$@"测试它是否被赋予了任何参数,如果是,它会使用这些参数运行实用程序。