linux - 如何在 ssh 命令中使用长输入参数正确转义 qsub 命令?

标签 linux bash unix ssh

我有一个复杂的 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/

相关文章:

php - 查找特定日期的文件,然后搜索电话号码

linux - 变量在 shell 脚本中不起作用

c - 我如何知道 C 程序的可执行文件是在前台还是后台运行?

linux - Linux 功能是否划分了可能的特权操作?

python - 如何按数字对 linux 中的文件进行排序?

c - linux,write()系统调用在尝试写入文件时返回-1

java - 如何从不同的目录运行 java 程序?

我可以为 C 项目重新生成一个具有正确链接顺序和依赖项的 makefile 吗?

linux - 2g 在 sed 中无法跳过第一次出现的匹配项

linux - 将 file 的 cat 输出重定向到同一文件