gpt4 book ai didi

macos - 在 Mac OS X 中忽略 xargs 的空结果

转载 作者:行者123 更新时间:2023-12-03 22:33:48 27 4
gpt4 key购买 nike

我网站的代码使用这段代码在服务器(Ubuntu)上进行自动部署。

cmd = 'cd ' + checkout_dir + ' && ' + svn_command + " st | awk '{print $2}' | grep -v ^deploy | tac | xargs -r" + svn_command + " revert -R && " + svn_command + ' up -r ' + options.revision



这个命令的作用是 cd进入结帐目录,运行 svn status ,然后提取文件名( $2 ),删除 deploy目录及其列表中的所有文件(我不想恢复它)。如果没有参数,它不会运行 svn revert 命令,否则它会运行。

不幸的是 xargs -r在我的机器上不起作用(Mac OS X 10.8)。所以我被困在这里,有人可以帮忙吗?

最佳答案

确实,xargs的BSD实现没有 -r标志 ( --no-run-if-empty )。 Linux 中的 GNU 版本有它。

以下是一种在 Linux 和 BSD 中都适用的解决问题的方法:

... | (grep -v ^deploy || echo :) | xargs svn revert
grep ... || echo :在中间会生成一 strip 有 : 的行在这种情况下 grep 的输出是空的。有点脏,因为 xargs仍将运行命令 svn revert : .如果您的存储库不包含文件 :那么这应该没有影响,所以可以接受。 :可以是其他任何东西,只要您的存储库中没有这样的文件。

最后,如 @tripleee指出, grep ... || echo :必须包含在 (...) 内, 因为:

the || has higher precedence than |, and thus terminates the (first) pipeline.



您的代码看起来像一个 Python 字符串。这样会更易读:
kwargs = {
'svn': svn_command,
'dir': checkout_dir,
'revno': options.revision,
}
cmd = "cd {dir} && {svn} st | awk -v r=1 '$2 ! ~ /deploy/ {{ print $2; r=0 }} END {{ r || print \":\" }}' | xargs {svn} revert && {svn} up -r {revno}".format(**kwargs)

我对你的原文做了一些修改:
  • 移动了 grep 的逻辑内awk , 如 @tripleee建议。请注意,由于 grep不再需要 hack,也不再需要包裹在 (...)
  • 掉了 tac ,因为我没有看到它的重点
  • 掉了 -R来自 svn revert ,因为我认为你不需要它
  • 关于macos - 在 Mac OS X 中忽略 xargs 的空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17402345/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com