我有一个复杂的 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
如您所见,here-docs 对于带引号的输入确实很有帮助。
参见man bash | less +/'Here Documents'
编辑
来自您的评论:
I used this method but it gives me "Pseudo-terminal will not be allocated because stdin is not a terminal."
您可以使用
忽略此警告ssh mycluster <<EOF 2>/dev/null
(如果需要,请尝试使用 ssh
的 -t
开关)
如果你有
-bash: line 2: EOF: command not found
我认为您遇到了复制粘贴问题。尝试删除所有结束行上的多余空格
And it seems this method cannot pass local variable
$INPUTARGS
to the remote cluster
这似乎与您的 EOF
问题有关。
$argv
returns nothing on remote cluster
这是什么意思? $argv
不是 bash
中的预定义变量。如果需要列出命令行参数,请使用预定义变量 $@
最后一件事:确保您使用的是bash
关于linux - 如何在 ssh 命令中使用长输入参数正确转义 qsub 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775911/