我有一个复杂的 qsub 命令可以远程运行。
PROJECT_NAME_TEXT="TEST PROJECT"
PACK_ORGANIZATION="--source-organization \'MY, ORGANIZATION\'"
CONTACT_NAME="--contact-name \'Tom Riddle\'"
PROJECT_NAME_PACK="--project-name \"${PROJECT_NAME_TEXT}\""
INPUTARGS="${PACK_ORGANIZATION} ${CONTACT_NAME} ${PROJECT_NAME_PACK}"
ssh mycluster "qsub -v argv="$INPUTARGS" -l walltime=10:00:00 -l vmem=8GB -l nodes=1:ppn=4 /myscript_path/run.script"
问题是远程集群无法识别 qsub 命令,它总是显示不正确的 qsub 命令,或者由于输入参数错误而始终在集群上排队。
一定是转义问题,我的问题是如何正确转义上面的命令?
尝试使用here-doc:您有引号冲突(嵌套双引号是错误):
#!/bin/bash
PROJECT_NAME_TEXT="TEST PROJECT"
PACK_ORGANIZATION="--source-organization \'MY, ORGANIZATION\'"
CONTACT_NAME="--contact-name \'Tom Riddle\'"
PROJECT_NAME_PACK="--project-name \"${PROJECT_NAME_TEXT}\""
INPUTARGS="${PACK_ORGANIZATION} ${CONTACT_NAME} ${PROJECT_NAME_PACK}"
ssh mycluster <<EOF
qsub -v argv="$INPUTARGS" -l walltime=10:00:00 -l vmem=8GB -l nodes=1:ppn=4 /myscript_path/run.script
EOF
如你看到的,此处文档对于带引号的输入确实很有帮助。
See man bash | less +/'Here Documents' http://www.gnu.org/software/bash/manual/bashref.html#Here-Documents
Edit
根据您的评论:
我使用了这种方法,但它给了我“不会分配伪终端,因为标准输入不是终端。”
您可以忽略此警告
ssh mycluster <<EOF 2>/dev/null
(尝试-t
切换为ssh
如果需要的话)
如果你有
-bash: line 2: EOF: command not found
我认为你有复制粘贴问题。尝试删除所有端线上的多余空格
而且这个方法似乎无法传递局部变量$INPUTARGS
到远程集群
这似乎与你有关EOF
问题。
$argv
在远程集群上不返回任何内容
这意味着什么?$argv
不是预定义变量bash
。如果需要列出命令行参数,请使用预定义变量$@
最后一件事:确保您正在使用bash
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)