在tcsh中构建要执行的命令行问题(由lsf执行),vars和引号问题

时间:2018-11-20 22:24:09

标签: shell variables command-line csh tcsh

我正在使用tcsh(需要合同,不能更改为bash等),但是在根据不同条件针对不同部件构建命令时遇到了问题。

为了保护无辜者而更改了一些名字...

如果是新的或旧的程序名称,实际上是由预处理器在较早的时候选择的,并且在运行该Shell脚本时被硬编码:

set myCMDline = newProgName
set myCMDlineTmpFile = "/tmp/myCMDlineTmpScriptFile.csh"
set bsubQname = "typical"

set bsubResources = "span[hosts=1]"
set myCMDline  = "bsub -q $bsubQname -n 8 -R \"$bsubResources\" $myCMDline"

($myCMDline)

现在,我已经尝试了上述几种变体,但由于某种或其他原因均无法正常工作。我认为我得到的最接近的是关于不匹配的双引号的投诉,即使在退格时也是如此。

当我执行$ myCMDline的回显时,这看起来还可以,但是相同的执行必须有所不同...

set bsubResources = '"span[hosts=1]"'    #double-quotes inside, single-quotes outside
set myCMDline  = "bsub -q $bsubQname -n 8 -R $bsubResources $myCMDline"

set bsubResources = "span[hosts=1]"    #double-quotes inside, single-quotes outside
set myCMDline  = 'bsub -q $bsubQname -n 8 -R "$bsubResources" $myCMDline'

set bsubResources = "span[hosts=1]"    #double-quotes inside, single-quotes outside
set myCMDline  = "bsub -q $bsubQname -n 8 -R '$bsubResources' $myCMDline"

我还尝试将数据转储到单独的临时脚本文件中以获取源代码,但是其中包含$ variable名称,而不是我想设置的可解析等效项,因为我正在设置而不是setenv,并且不想将其放入shell中vars。

首先,我无法回显“#!/ bin / csh -f”行,它似乎尝试执行该命令,而不是回显重定向到临时脚本文件中并死了。

rm -f $myCMDlineTmpFile
echo "#!/bin/csh -f  > $myCMDlineTmpFile
echo "$myCMDline" >> $myCMDlineTmpFile
($myCMDlineTmpFile)

然后我尝试了多行回显,这是我在其中看到局部变量名称而不是其内容进入文件的地方:

/bin/cat > $myCMDlineTmpFile <<EOF
#!/bin/csh -f
$myCMDline

EOF

source $myCMDlineTmpFile

然后我尝试改为使用eval:

eval `echo "$myCMDline &" `

带有和不带有反引号等,但是抱怨队列名称,资源等未知变量。

添加此回声总是看起来像我想成为命令行的>>>和<<<< / p>

echo "DEBUG - myCMDline= >>>$myCMDline<<<"

请帮助我解决这个难题...

1 个答案:

答案 0 :(得分:0)

set myCMDline  = "bsub -q $bsubQname -n 8 -R \"$bsubResources\" $myCMDline"

($myCMDline)

这不起作用,因为csh将其视为单个字符串,因此它将整个字符串视为一个大程序名。您必须定义一个数组:

set myCMDline  = (bsub -q $bsubQname -n 8 -R "$bsubResources" $myCMDline:gaq)
($myCMDline:gaq)

说明::gaq是一个替换,它引用列表中的所有字符串,并使每个列表元素保持完整。这与bash中的“ $ @”非常相似。

此内容记录在History Substitution

  

g 将以下修饰符应用于每个单词一次。

     

a (+)对单个单词尽可能多地应用以下修饰符。 “ a”和“ g”可以一起使用,以全局应用修饰符。在当前的实现中,将'a'和's'修饰符一起使用会导致无限循环。例如,`:as / f / ff /'将永远不会终止。这种行为将来可能会改变。

     

q 引用被替换的单词,以防止进一步的替换。

这与variable substitution中的文本有关,

  

History substitution下描述的`:'修饰符,除了`:p'可以应用于上述替换。可以使用多个。 (+)与History substitution(q.v.)一样,可能需要用大括号将变量替换与文字冒号隔开。所有修饰符都必须出现在括号内。