我正在使用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“行,它似乎试图执行该代码,而不是回显重定向到临时脚本文件中,然后就死了。
rm -f $myCMDlineTmpFile
echo "#!/bin/csh -f > $myCMDlineTmpFile
echo "$myCMDline" >> $myCMDlineTmpFile
($myCMDlineTmpFile)然后我尝试了多行echo,在这里我看到本地变量名进入文件,而不是它们的内容:
/bin/cat > $myCMDlineTmpFile <<EOF
#!/bin/csh -f
$myCMDline
EOF
source $myCMDlineTmpFile然后我尝试使用eval:
eval `echo "$myCMDline &" `使用和不使用反引号等,但抱怨队列名称、资源等的未知变量。
在>>>和<<<之间添加这个回显总是看起来像是我想要的命令行
echo "DEBUG - myCMDline= >>>$myCMDline<<<"请帮我解开这个谜题。
发布于 2019-03-25 23:19:23
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' andg‘可以一起使用来全局应用修饰符。在当前的实现中,同时使用a' and的修饰符可能会导致无限循环。例如,:as/f/ff/' will never terminate. This behavior might change in the future. **q`**引用替换的单词,以防止进一步的替换。
由于variable substitution中的文本,这是相关的
:' modifiers described under [History substitution](https://web.pa.msu.edu/reference/tcsh-web/History_substitution.html), except for:p',可以应用于上面的替换。可以使用多个。(+)可能需要大括号将变量替换与原义冒号隔开,就像History substitution (q.v.)一样;任何修饰符都必须出现在大括号内。
https://stackoverflow.com/questions/53402505
复制相似问题