csh环境下modulefile中set-alias变量替换异常问题求助
解决csh modulefile中别名保留$环境变量的问题
问题分析
在csh的modulefile中设置别名时,$jobRunName被转换为!!:jobRunName,这是因为csh默认将别名中的$视为历史替换标记(如!!:n引用历史命令的第n个词),同时modulefile作为TCL脚本,双引号内的变量会被提前展开,导致转义失效。
解决方案
方案1:使用单引号避免TCL变量展开
直接用单引号包裹别名的固定部分,将需要动态展开的module变量放在单引号外拼接,这样$jobRunName会原封不动传递给csh别名:
set queueNameBatch "testQueue" set-alias qt 'sbatch -o ./logs/srun.%j.log -e ./logs/srun.%j.err -J $jobRunName -p '$queueNameBatch
方案2:双重转义$符号
在TCL脚本中用\\$表示最终的\$,让TCL解析后传递给csh,csh执行别名时会将\$转换为$,从而保留环境变量引用:
set queueNameBatch "testQueue" set jobQcmd "sbatch -o ./logs/srun.%j.log -e ./logs/srun.%j.err -J \\$jobRunName -p " set-alias qt "$jobQcmd $queueNameBatch"
验证
执行which qt会得到预期结果:
qt: aliased to sbatch -o ./logs/srun.%j.log -e ./logs/srun.%j.err -J $jobRunName -p testQueue
此时设置环境变量setenv jobRunName "myJob"后,执行qt即可将-J参数设为myJob。
内容的提问来源于stack exchange,提问作者billt
相关产品推荐
相关产品推荐

