【问题标题】:Don't call xargs if the previous command doesn't return anything [duplicate]如果上一个命令没有返回任何内容,则不要调用 xargs [重复]
【发布时间】: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,那么您将不得不努力工作。

标签: shell 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://stackoverflow.com/a/19038748/1655942

      【讨论】:

      • 虽然最后 2 个示例有效(并允许重复替换要处理的项目),但它们将为列表中的每个项目执行命令(因为隐含的 -L 1),这可能意味着在处理大型列表时会影响性能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 2020-01-27
      相关资源
      最近更新 更多