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

Anu*_*wal 14 svn macos shell awk xargs

我的网站代码使用这段代码在服务器(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进入checkout目录,运行svn status,然后提取filename($2),deploy从列表中删除目录及其所有文件(我不想还原它).如果没有参数,它不会运行svn revert命令,否则它会运行.

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

Sto*_*ica 5

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

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

... | (grep -v ^deploy || echo :) | xargs svn revert
Run Code Online (Sandbox Code Playgroud)

grep ... || echo :在中间会产生具有一个线:在它的情况下的输出grep是空的。它有点,因为xargs仍然会运行命令svn revert :。如果您的存储库不包含该文件,:那么这应该不起作用,因此可以接受。的:可能是其他任何东西,只要有在你的仓库没有这样的文件。

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

||优先级高于|,因此终止(第一个)管道。

您的代码看起来像一个 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)
Run Code Online (Sandbox Code Playgroud)

我对你的原文做了一些修改:

  • 正如@tripleee建议的那样,移动了grepinside的逻辑。请注意,由于不再需要 hack,因此也不再需要包装awkgrep(...)
  • 删除了tac,因为我看不出它的意义
  • 删除了-Rfrom svn revert,因为我认为你不需要它