我正在使用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<<<"
请帮助我解决这个难题...
答案 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.)一样,可能需要用大括号将变量替换与文字冒号隔开。所有修饰符都必须出现在括号内。