【问题标题】:How to write a CVS wrapper script如何编写 CVS 包装脚本
【发布时间】:2011-05-25 16:01:22
【问题描述】:

我想编写一个 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 脚本?

【问题讨论】:

  • 我也考虑过在主机端对所有参数进行转码,然后在目的地对其进行解码,但这是一个丑陋的解决方案。

标签: cvs csh sungridengine rsh


【解决方案1】:

调用:

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

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

【讨论】:

  • 在 csh 中有没有办法在参数中添加转义引号?至少它确实有效。
【解决方案2】:

我宣布失败,只是用 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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多