Как написать скрипт оболочки CVS - PullRequest
0 голосов
/ 25 мая 2011

Я хотел бы написать сценарий оболочки CVS, который выполняет команду на другом компьютере с использованием RSH, но у меня возникают проблемы с кавычками.

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

Проблема заключается в том, что даже если аргументы передаются с кавычкамиRSH, кажется, отбрасывает их при выполнении команды.Следующая команда должна отображаться как 3 аргумента в месте назначения, но вместо этого есть 4.

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

Я не ищу совета о том, как не использовать rsh, так как я действительно использую qrsh, rsh-совместимыйверсия для SGE.Я подумал об использовании интерпретатора, но я не знаю, как избежать кавычек в строках:

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

Я наиболее знаком с c-shell, но хотел бы рассмотреть сценарий bash, если кто-тоНапиши это.Как я могу написать этот скрипт CVS?

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

Я объявил поражение и только что написал сценарий на 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 голосов
/ 25 мая 2011

Вызов:

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

, все что они делают - получают строку с пробелом в том же аргументе.

...