2011-05-25 66 views
0

我想编写一个CVS包装脚本,该脚本在使用RSH的另一台机器上执行该命令,但在报价时遇到问题。如何编写一个CVS包装脚本

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

问题是,即使参数是用引号传递的,当命令执行时,RSH似乎会丢弃它们。下面的命令应该在目的地显示为3个参数,但是有4个参数。

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

我不是在寻找咨询如何不因为我真的很喜欢使用的qrsh,一个RSH兼容的版本。SGE使用rsh。我考虑过用一个解释,但我不知道如何为字符串内逃脱报价:

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

我最熟悉的C-shell,但如果有人写它愿意考虑一个bash脚本。我该如何编写这个CVS脚本?

+0

我也考虑过在主机端对所有参数进行转码,然后在目标端对它们进行解码,但这是一个丑陋的解决方案。 – dromodel 2011-05-25 16:24:31

回答

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()) 
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 

他们所做的一切就是将带有空格的字符串获取到相同的参数中。

+0

在csh中添加转义引号给参数有没有办法?它至少起作用。 – dromodel 2011-05-25 16:26:10

相关问题