我正在使用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变量。
首先,我无法回应“#!/ bin / csh -f”行,它似乎尝试执行而不是将echo重定向到临时脚本文件中,然后死掉。
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 &" `
有和没有反引号等,但抱怨队列名称,资源等未知变量。
在>>>和<<<之间添加这个echo总是看起来像我想成为命令行
echo "DEBUG - myCMDline= >>>$myCMDline<<<"
请帮我解决这个难题......
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中的文字,这是相关的:
除了`:p'之外,History substitution下描述的`:'修饰符可以应用于上面的替换。可以使用多个。 (+)与History substitution(q.v.)一样,可能需要大括号来对文字冒号的变量替换进行隔离。任何修饰符都必须出现在大括号内。