我想写一个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脚本?
答案 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())