如果上一个命令没有返回任何内容,则不要调用 xargs [重复]

Posted

技术标签:

【中文标题】如果上一个命令没有返回任何内容,则不要调用 xargs [重复]【英文标题】:Don't call xargs if the previous command doesn't return anything [duplicate] 【发布时间】:2013-09-19 16:51:54 【问题描述】:

我有以下命令检查是否添加了任何新文件并在所有这些文件上自动调用svn add

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk 'print $2' | xargs svn add

但是当没有文件时,svn add 会导致警告。

如何阻止xargs 调用上一个命令不会产生任何值?该解决方案需要适用于xargs 的GNU 和BSD (Mac OS X) 版本。

【问题讨论】:

xargs 的 POSIX 标准(在设置标准之前建立在 xargs 的实际实现之上)要求即使没有文件名,也需要执行一次命令。只有 GNU 版本似乎承认……白痴? ......该要求的滋扰因素。如果您的代码必须在有和没有 GNU xargs 的平台上工作,而无需安装 GNU xargs,那么您将不得不努力工作。 【参考方案1】:

如果您运行的是 GNU 版本,请使用 xargs -r

--no-run-if-empty -r 如果标准输入不包含任何非空格,请不要运行该命令。 通常,即使没有输入,该命令也会运行一次。这个选项 是一个 GNU 扩展。

http://linux.die.net/man/1/xargs

【讨论】:

谢谢。但不幸的是,我需要这个脚本在 GNU 和 BSD (Mac) 版本中都可以工作。【参考方案2】:

如果您使用 bash,另一种方法是将输出存储在数组中。并且只有在有输出时才运行 svn。

readarray -t OUTPUT < <(exec svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk 'print $2')
[[ $#OUTPUT[@] -gt 0 ]] && svn add "$OUTPUT[@]"

【讨论】:

【参考方案3】:

我最终使用了这个。不是很优雅,但很有效。

svn status | grep -v "^.[ \t]*\..*" | grep "^?" && svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk 'print $2' | xargs svn add

【讨论】:

【参考方案4】:
ls /empty_dir/ | xargs -n10 chown root   # chown executed every 10 args
ls /empty_dir/ | xargs -L10 chown root   # chown executed every 10 lines
ls /empty_dir/ | xargs -i cp  .bak   # every  is replaced with the args from one input line
ls /empty_dir/ | xargs -I ARG cp ARG ARG.bak # like -i, with a user-specified placeholder

https://***.com/a/19038748/1655942

【讨论】:

虽然最后 2 个示例有效(并允许重复替换要处理的项目),但它们将为列表中的每个项目执行命令(因为隐含的 -L 1),这可能意味着在处理大型列表时会影响性能。

以上是关于如果上一个命令没有返回任何内容,则不要调用 xargs [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果任何命令返回非零值,则中止 shell 脚本

Java或C#调用命令行批处理命令如何获得返回值

Leetcode练习(Python):第367题:有效的完全平方数:给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。 说明:不要使用任何

Leetcode练习(Python):第367题:有效的完全平方数:给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。 说明:不要使用任何

对 PHP 的 Ajax 调用没有返回任何内容

始终调用 p:ajax 事件的 oncomplete,即使侦听器没有返回任何内容[重复]