如何编写CVS包装器脚本

时间:2011-05-25 16:01:23

标签: cvs csh sungridengine rsh

我想写一个CVS包装器脚本,它使用RSH在另一台机器上执行该命令,但是我的报价有问题。

#!/bin/csh -f
rsh <machine> cvs $*:q

问题在于,即使参数传递了引号,RSH似乎在执行命令时会丢弃它们。以下命令应在目标处显示为3个参数,但代之以4个。

cvsWrap diff -D "2011-05-01 00:00:00"

我不是在寻找关于如何不使用rsh的建议,因为我真的使用qrsh,这是SGE的兼容版本。我考虑过使用解释器,但我不知道如何在字符串中转义引号:

rsh <machine> /bin/csh -c "cvs $*:q"

我最熟悉c-shell但是如果有人写的话,他会愿意考虑使用bash脚本。我该如何编写这个CVS脚本?

2 个答案:

答案 0 :(得分:0)

调用:

cvsWrap diff -D \"2011-05-01 00:00:00\"

可能会有所帮助,但并不理想。

潜在的问题是,csh会将你的引号作为一个开放的开局扔掉,因为它将它们分组以将它们放入argv中,因此你的引号永远不会真正进入cvsWrap。相反,你有

argv[1] == diff
argv[2] == -D
argv[3] == 2011-05-01 00:00:00

他们所做的就是将带有空格的字符串放入同一个参数中。

答案 1 :(得分:0)

我宣布失败并且只是在Groovy中编写了脚本。

#!/usr/bin/env groovy
def rshCmd = "qrsh -cwd -now n -b y".split().toList()
def cvsCmd = ["cvs"] + args.collect { '"' + it + '"' }
def process = (qrshCmd + cvsCmd).execute()

def outTh = Thread.start {
  try {
    process.in.eachLine {
      System.out.println it
    }
  } catch(e) {}
}

def errTh = Thread.start {
  try {
    process.err.eachLine {
      System.err.println it
    }
  } catch(e) {}
}

outTh.join()
errTh.join()
process.waitFor()
System.exit(process.exitValue())