Ale*_*lls 7 pipe xargs newlines
我有这个命令:
docker volume ls -qf dangling=true | xargs docker volume rm
Run Code Online (Sandbox Code Playgroud)
我明白了:
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...]
我认为这是因为没有输入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 "$@"
测试它是否被赋予了任何参数,如果是,它会使用这些参数运行实用程序。