2013-10-16 82 views
1

我有這樣的腳本:爲什麼在這個bash腳本中執行的順序是顛倒的?

ssh -T [email protected]$123.456.789.123 <<EOF 

    cd www 

    var=$(tail index.htm) 

    echo $var 

EOF 

我認爲它應該做的是:

  1. 連接到服務器通過SSH
  2. 然後更改到該文件夾​​WWW
  3. 然後存儲尾部index.htm納入變量var
  4. 最後echo結果。

相反,它似乎是文件夾的變化之前執行,因此不會找到的index.htm文件

我試過了不同的命令,每次看起來命令替換的結果我試圖存儲到變量中,在SSH連接打開之後,在任何其他腳本之前執行。

我在這裏錯過了什麼?

回答

3

$(...)正在本地擴大,在此文件中的內容傳遞給ssh之前。要將文字文本發送到遠程服務器,請引用here文檔分隔符。

ssh -T [email protected]$123.456.789.123 <<'EOF' 
    cd www 
    var=$(tail index.htm) 
    echo "$var" 
EOF 

(此外,引用的$var擴張,以保護任何嵌入間距從shell)

2

tail正在本地機器上的bash腳本中運行,而不是在遠程主機上運行。在執行ssh命令之前,替換操作已經完成。

您的腳本可以簡單地進行更換:

ssh -T [email protected]$123.456.789.123 tail www/index.htm 
2

如果您希望將這些命令發送到遠程服務器,你可以寫

ssh -T [email protected]$123.456.789.123 'cd www && var=$(tail index.htm) && echo $var' 

請注意,調整前一個結果的下一個命令允許SSH返回有意義的返回碼。在你的heredoc中,無論發生什麼(例如tail失敗),SSH都將返回$?= 0,因爲echo不會失敗。

另一個選擇是在那裏創建一個腳本並用ssh啓動它。

+1

'$(...)'仍然會在本地展開,就像這裏沒有引用這裏的文檔一樣。 – chepner

+1

@chepner更正。 – damienfrancois