0

我想编写一个 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 兼容版本。我考虑过使用解释器,但我不知道如何转义字符串中的引号:

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

我最熟悉 c-shell,但如果有人要编写它,我愿意考虑使用 bash 脚本。如何编写这个 CVS 脚本?

4

2 回答 2

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

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

于 2011-05-25T16:20:07.967 回答
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())
于 2011-05-25T20:00:26.207 回答