如何向qsub传递参数展开?解决参数变量不识别报错问题
问题根因
你碰到的Invalid null command报错和-V参数无关,是两个语法用法错误导致的:
- 双引号嵌套错误:外层用双引号包裹整个执行命令串时,内部定义变量直接用双引号会导致引号提前闭合,命令串被本地shell错误拆分,最终传给qsub的内容存在空指令段。
-b y参数误用:-b y的作用是告知qsub后续传入的是二进制可执行文件路径,不会调用shell做解析,你传入的是拼接的shell命令串,用这个参数时变量展开逻辑根本不会触发。
另外你原命令里多行参数没有加换行转义符\,也会导致命令被拆分为多条独立语句执行,触发异常。
解决方案
优先推荐用here-document方式传作业脚本,不需要处理复杂的引号转义,可读性更强:
qsub -cwd -V -pe shared 4 -l h_data=8G,h_rt=00:10:00,highp -N bt2align3 << 'EOF' projPath="$SCRATCH/CUTnTag/data_kayaokur2020" sample="K4m3_rep1" cores=8 bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 \ -p ${cores} \ -x ${projPath}/bowtie2_index/GRCh38_noalt_analysis/GRCh38_noalt_as \ -1 ${projPath}/raw_fastq/${sample}_R1.fastq.gz \ -2 ${projPath}/raw_fastq/${sample}_R2.fastq.gz \ -S ${projPath}/alignment/sam/${sample}_bowtie2.sam &> ${projPath}/alignment/sam/bowtie2_summary/${sample}_bowtie2.txt EOF
写法说明:
- 用
<< 'EOF'标记包裹作业执行内容时,单引号可以保证所有变量不会在提交节点被提前展开,会完整传递到计算节点由作业shell解析 -V参数会正常将你提交时本地的环境变量(比如$SCRATCH)同步到计算节点运行环境,不存在变量识别问题- 多行命令末尾加
\做换行转义,避免被识别为多条独立命令
如果你一定要用单行命令传参的写法,需要手动转义所有内部双引号、以及需要在计算节点展开的变量的$符号,同时去掉-b y参数:
qsub -cwd -V -pe shared 4 -l h_data=8G,h_rt=00:10:00,highp -N bt2align3 "projPath=\"\$SCRATCH/CUTnTag/data_kayaokur2020\"; sample=\"K4m3_rep1\"; cores=8; bowtie2 --end-to-end --very-sensitive --no-mixed --no-discordant --phred33 -I 10 -X 700 -p \${cores} -x \${projPath}/bowtie2_index/GRCh38_noalt_analysis/GRCh38_noalt_as -1 \${projPath}/raw_fastq/\${sample}_R1.fastq.gz -2 \${projPath}/raw_fastq/\${sample}_R2.fastq.gz -S \${projPath}/alignment/sam/\${sample}_bowtie2.sam &> \${projPath}/alignment/sam/bowtie2_summary/\${sample}_bowtie2.txt"
这种写法转义规则复杂,很容易漏写转义符导致报错,非必要不使用。
补充说明:qsub本身不负责解析变量展开,${variable}格式的变量是由运行作业的shell负责解析的,只要命令内容正确传递给计算节点的shell,就可以正常识别,不需要更换特殊语法。
内容的提问来源于stack exchange,提问作者JohnnyJi
相关产品推荐
相关产品推荐

