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

问题描述 投票:0回答:1

我正在使用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<<<"

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

shell variables command-line csh tcsh
1个回答
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中的文字,这是相关的:

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

© www.soinside.com 2019 - 2024. All rights reserved.