如何在qsub的-v选项中传递含逗号或换行的变量
在qsub中传递含逗号/换行的环境变量
问题场景
通常我们通过qsub传递环境变量的写法如下:
info="This is some info" qsub -v INFO=$info script.pbs
但当$info包含逗号时会触发错误:
info="This is some info, and here is some more!" qsub -v INFO=$info script.pbs
报错信息:
ERROR:
-v: variable ' and here is some more!' is not set in environment variables.
即便尝试用INFO="$info"包裹变量,问题依然存在;变量包含换行时也会出现同样错误。另外需要注意,echo -e $info能正常输出内容,仅qsub命令会触发该报错。
解决方法
方法1:单引号包裹变量赋值前缀
qsub的-v参数会将逗号识别为多变量的分隔符,因此需要让qsub把整个值判定为单个变量。可以用单引号包裹INFO=部分,让$info在单引号外被shell展开:
info="This is some info, and here is some more!" qsub -v 'INFO='$info script.pbs
这种写法会让qsub将整个内容识别为单个变量赋值,不会把逗号拆分成多个变量。
方法2:通过环境变量文件传递
如果变量内容包含换行、大量特殊字符,更稳妥的方式是借助环境变量文件传递:
- 导出变量并写入临时文件:
info="This is some info, and here is some more! With a new line!" export INFO="$info" env | grep ^INFO= > env_vars.txt
- 用qsub加载该文件:
qsub -V -@ env_vars.txt script.pbs
-V参数会传递当前环境变量,-@指定加载环境变量文件,能完美兼容复杂内容的传递。
方法3:转义逗号(仅适配逗号场景)
如果仅需处理逗号问题,可以对逗号进行转义,避免qsub将其识别为分隔符:
info="This is some info\, and here is some more!" qsub -v INFO=$info script.pbs
但这种方法对换行无效,且多逗号场景需要逐个转义,通用性不如前两种方法。
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

