如果未向 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手册)。

来自 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

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

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

相关内容