【问题标题】:Using xargs twice in one line for to fix subversion «!» status在一行中使用 xargs 两次来修复颠覆 «!»状态
【发布时间】:2012-09-13 09:16:11
【问题描述】:

我在这里找到了解决我问题的最佳方法:Howto fix subversion «!» status

但现在,我只想写一个小脚本来做到这一点。

像这样:

svn status | grep '\!' | awk '{print $2}' | xargs svn revert

svn status | grep '\!' | awk '{print $2}' | xargs svn delete

但在一行中。

因为,在 svn revert 之后,"svn status | grep '!'" 没有返回任何结果。理性。

我认为我找到了解决方案:Putting the data passed to xargs twice in one line 但我的英语有点生疏,命令行不是我的强项。

【问题讨论】:

    标签: svn shell status xargs


    【解决方案1】:
    svn status | grep '\!' | awk '{print $2}' | tee list.$$ | xargs svn revert
    xargs svn delete < list.$$
    rm list.$$
    

    tee 命令就像一个 T 形管件;输出的一个副本到每个命名文件,另一个到标准输出。在这里,我只命名了一个文件。这会强制所有还原发生在任何删除之前。名称list.$$ 是一种保护脚本不践踏其他进程文件的简单方法;有像mktemp 这样的程序可以用来创建更安全、更难预测的名称。 OTOH,如果您没有在恶劣的环境中运行,那么这不太重要。如果你真的很小心,你会创建一个trap 来确保文件被清理:

    tmp=${TMPDIR:-/tmp}/list.$$
    trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
    
    svn status | grep '\!' | awk '{print $2}' | tee $tmp | xargs svn revert
    xargs svn delete < $tmp
    
    rm $tmp
    trap 0
    

    还有其他可以尝试的技巧,但至少其中一些不能保证顺序操作。比如bash中的进程替换:

    svn status | grep '\!' | awk '{print $2}' | tee >(xargs svn revert) | xargs svn delete
    

    每个文件都会被还原和删除,但顺序是不可预测的。

    【讨论】:

    • 可以很好地处理陷阱。只是恢复目录的一些错误,但之后 svn delete 工作。非常感谢。
    【解决方案2】:

    两个命令在一行中。注意 xargs 的完全丢失。并不是说 xargs 不好,只是这里不需要。

    x="$(svn status | grep '\!' | awk '{print $2}')"; svn 还原 "$x" && svn 删除 "$x" || echo "no svn delete $?"

    请注意,如果 svn revert 失败,svn delete 将不会运行。 “no svn delete”表示其中一个 svn 命令失败。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2022-11-26
      • 2015-12-07
      • 1970-01-01
      • 2010-10-27
      相关资源
      最近更新 更多