2017-05-19 635 views
0

,以便我可以在远程机器上执行结果,但是,我遇到了用户定义变量无法执行的问题被认可。当我使用ssh在shell脚本中执行远程文件时,ssh命令无法返回在远程机器上执行的结果

  1. 我创建了一个shell脚本run.sh这样

    #!/bin/bash 
    ssh [email protected] << EOF 
    ./test.sh && ret=1 || ret=0 
    echo "before" 
    echo ${ret} 
    echo "after" 
    echo ${HOME} 
    exit ${ret} 
    EOF 
    
  2. 的test.sh的内容通过run.sh称为:

    #!/bin/bash 
    echo "lala" 
    exit 1 
    
  3. 当我打电话./run.sh 它这样打印

    lala 
    before 
    
    after 
    /home/jenkins 
    

为什么不回声${ret}?在调用./run.sh之后,echo $?是0这是意想不到的,我认为它应该在这里回显1。 谢谢!

回答

2

因为heredoc中的变量在被发送到ssh的标准输入之前被本地脚本扩展。

换句话说,你的定界符行为类似于

#!/bin/bash 
string="echo \"before\" 
echo ${ret} 
echo \"after\" 
echo ${HOME} 
exit ${ret} 
./test.sh && ret=1 || ret=0" 
echo "$string" | ssh [email protected] 

这使得它更明显的是,字符串有插值的变量。

周围有这样的几种方法:要么你能逃脱$符号(例如echo \${ret}),因此预期字符串被通过,或者您可以使用逐字定界符

#!/bin/bash 
ssh [email protected] <<'EOF' 
./test.sh && ret=1 || ret=0 
echo "before" 
echo ${ret} 
echo "after" 
echo ${HOME} 
exit ${ret} 
EOF 

通过单引号分隔符,我们确保heredoc内没有扩展。

+0

非常感谢,这非常有帮助 – wangwang3210

相关问题