SLURM环境sbatch --wrap语句反引号内部变量替换问题咨询
问题根因
问题本质是双引号包裹的内容中,未转义的反引号会在提交任务的本地Shell提前执行,而非将反引号内的逻辑传递给计算节点执行:
你提交命令时,本地Shell已经先运行了echo "2 $i",此时本地环境不存在i变量,$i被解析为空值,最终传递给--wrap的实际逻辑等价于for((i=0; i<3; i++)); do TMP=2; echo ${TMP}; done,所以输出全为2。
解决方案
方案1:转义反引号及内部需要延迟解析的变量
将反引号用\转义,确保反引号整体被传递到计算节点执行:
X=2 sbatch --wrap="for((i=0; i<3; i++)); do TMP=\`echo \"${X} \$i\"\`; echo \${TMP}; done"
方案2:用$()替代反引号(更推荐,转义逻辑更清晰)
$()是命令替换的更规范写法,只需要转义开头的$即可,可读性更高:
X=2 sbatch --wrap="for((i=0; i<3; i++)); do TMP=\$(echo \"${X} \$i\"); echo \${TMP}; done"
两种方案运行后,slurm输出文件都会得到预期结果:
2 0 2 1 2 2
内容的提问来源于stack exchange,提问作者irritable_phd_syndrome
相关产品推荐
相关产品推荐

