2017-05-19 32 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

相關問題