![如果未向 xargs 提供任何输入,则不要让 xargs 运行该实用程序](https://linux22.com/image/154379/%E5%A6%82%E6%9E%9C%E6%9C%AA%E5%90%91%20xargs%20%E6%8F%90%E4%BE%9B%E4%BB%BB%E4%BD%95%E8%BE%93%E5%85%A5%EF%BC%8C%E5%88%99%E4%B8%8D%E8%A6%81%E8%AE%A9%20xargs%20%E8%BF%90%E8%A1%8C%E8%AF%A5%E5%AE%9E%E7%94%A8%E7%A8%8B%E5%BA%8F%20.png)
我有这个命令:
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 "$@"
测试是否为其提供了任何参数,如果是,则它使用这些参数运行该实用程序。