首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tcsh中构建要执行的命令行时出现问题(由lsf执行),变量和引号出现问题

在tcsh中构建要执行的命令行时出现问题(由lsf执行),变量和引号出现问题
EN

Stack Overflow用户
提问于 2018-11-21 06:24:09
回答 1查看 161关注 0票数 0

我正在使用tcsh (需要合同,不能更改为bash等),但在为不同的部分构建基于各种条件的命令时遇到了问题。

为了保护无辜的人而更改了一些名字。

如果新的或旧的程序名确实是由预处理器在较早的时候选择的,并且在运行此shell脚本时是硬编码的:

代码语言:javascript
复制
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的时候,看起来还可以,但是相同的执行一定是不同的……

代码语言:javascript
复制
set bsubResources = '"span[hosts=1]"'    #double-quotes inside, single-quotes outside
set myCMDline  = "bsub -q $bsubQname -n 8 -R $bsubResources $myCMDline"

代码语言:javascript
复制
set bsubResources = "span[hosts=1]"    #double-quotes inside, single-quotes outside
set myCMDline  = 'bsub -q $bsubQname -n 8 -R "$bsubResources" $myCMDline'

代码语言:javascript
复制
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“行,它似乎试图执行该代码,而不是回显重定向到临时脚本文件中,然后就死了。

代码语言:javascript
复制
rm -f $myCMDlineTmpFile
echo "#!/bin/csh -f  > $myCMDlineTmpFile
echo "$myCMDline" >> $myCMDlineTmpFile
($myCMDlineTmpFile)

然后我尝试了多行echo,在这里我看到本地变量名进入文件,而不是它们的内容:

代码语言:javascript
复制
/bin/cat > $myCMDlineTmpFile <<EOF
#!/bin/csh -f
$myCMDline

EOF

source $myCMDlineTmpFile

然后我尝试使用eval:

代码语言:javascript
复制
eval `echo "$myCMDline &" `

使用和不使用反引号等,但抱怨队列名称、资源等的未知变量。

在>>>和<<<之间添加这个回显总是看起来像是我想要的命令行

代码语言:javascript
复制
echo "DEBUG - myCMDline= >>>$myCMDline<<<"

请帮我解开这个谜题。

EN

回答 1

Stack Overflow用户

发布于 2019-03-25 23:19:23

set myCMDline = "bsub -q $bsubQname -n 8 -R \"$bsubResources\“$myCMDline”($myCMDline)

这是行不通的,因为csh将其视为单个字符串,因此它将整个字符串视为一个大的程序名称。相反,您必须定义一个数组:

代码语言:javascript
复制
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.)一样;任何修饰符都必须出现在大括号内。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53402505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档