tom*_*234 5 unix linux ssh bash cluster-computing
ssh remotecluster 'bash -s' << EOF
> export TEST="sdfsd"
> echo $TEST
> EOF
Run Code Online (Sandbox Code Playgroud)
这不打印任何内容。
即使我将变量存储到文件中并将其复制到远程,它仍然不起作用。
TEST="sdfsdf"
echo $TEST > temp.par
scp temp.par remotecluster
ssh remotecluster 'bash -s' << EOF
> export test2=`cat temp.par`
> echo $test2
> EOF
Run Code Online (Sandbox Code Playgroud)
仍然没有打印任何内容。
所以我的问题是如何将本地变量作为变量传递给远程机器?
答案已在此给出
小智 4
Here 文档中给出的变量赋值TEST="sdfsd"并不是真正的变量赋值,即变量赋值实际上不会直接在 Here 文档的声明/定义中执行(但稍后当 Here 文档由 shell 求值时)。
此外,在本地 shell 执行命令之前,未转义或未加引号的此处文档中包含的变量将由本地 shell$TEST展开。结果是,如果在命令或此处文档之前的本地 shell 中未分别定义该字符串,则该字符串将解析为空字符串。ssh$TESTssh
结果,export TEST="sdfsd"这里文档中的变量赋值不会在本地 shell 中生效,而是先发送到远程主机的 shell 中,然后在那里进行扩展,因此您不会打印任何经验。
解决方案是使用转义或单引号的此处文档,<<\EOF或者<<'EOF'; 或者只转义\$TEST此处文档中的变量;$TEST或者只是在命令之前定义变量ssh(以及此处的文档)。
# prints sdfsd
export TEST="sdfsd"
ssh localhost 'bash -s' << EOF
echo $TEST
EOF
# prints sdfsd
ssh localhost 'bash -s' << EOF
export TEST="sdfsd"
echo \$TEST
EOF
# prints sdfsd
ssh localhost 'bash -s' <<'EOF'
export TEST="sdfsd"
echo $TEST
EOF
Run Code Online (Sandbox Code Playgroud)