感谢所有答案,但是他们的方法不适用于我的情况。我必须自己回答这个问题,因为这个问题非常复杂,我从 stackoverflow 中的现有解决方案中得到了线索。
就我而言,有两个问题必须解决。
将本地程序的参数传递给远程集群。Here-doc 解决方案在这种情况下不起作用。
使用 long 变量作为包含引号符号的参数在远程集群上运行 qsub。
问题1。
首先,我必须介绍我在本地机器上运行的脚本采用如下参数:
scripttoberunoncluster.py --source-organisation "My_organization_my_department" --project-name "MyProjectName" --processes 4 /targetoutputfolder/
真正的参数远比上面的长,所以所有的参数都必须发送到remote。它们以这样的文件形式发送:
PROJECT_NAME="MyProjectName"
PACK_ORGANIZATION="--source-organization '\\\"My_organization_my_department\\\"'" # multiple layers of escaping, remove all the spaces
PROJECT_NAME_PACK="--project-name '\\\"${PROJECT_NAME}\\\"'"
PROCESSES_="--processes 4"
TARGET_FOLDER_PACK="/targetoutputfolder/"
INPUTARGS="${PACK_ORGANIZATION} ${PROJECT_NAME_PACK} ${PROCESSES} ${TARGET_FOLDER_PACK}"
echo $INPUTARGS > "TempPath/temp.par"
scp "TempPath/temp.par" "remotecluster:/remotepath/"
我的解决方案有点妥协。但是通过这种方式,远程集群可以运行参数包含引号的脚本。如果您没有将所有变量(作为参数)放在一个文件中并将其传输到远程集群,那么无论您如何将它们传递给变量,引号符号都将被删除。
问题 2。
检查 qsub 如何在远程集群上运行。
ssh remotecluster "qsub -v argv=\"`cat /remotepath/temp.par`\" -l walltime=10:00:00 /remotepath/my.script"
在 my.script 中:
INPUT_ARGS=`echo $argv`
python "/pythonprogramlocation/scripttoberunoncluster.py" $INPUT_ARGS ; #note: $INPUT_ARGS hasn't quote