2017-01-03 58 views
0

我的bash腳本中存在一些不一致的行爲。 存在變量,並且它們都具有分配給它們的值,我通過在腳本開始處回顯值來確認它們。遠程SSH會話中的變量

但是,將它們傳遞給遠程SSH會話時,其中一個變量具有值,而另一個變量則顯示爲空白。我很確定我不覆蓋變量的值。

# Script input arguments 
USER=$1 
SERVER=$2 
# Other vars 
PFX=$8 
# 
[email protected]$SERVER 

function run { 
    ssh $ADDRESS /bin/bash [email protected] 
} 

# Script body, some stuff happens here 
run << "SSHCONNECTION2" 
    sudo mv "/home/$USER/$PFX" "/home/$USER/certs/" 
SSHCONNECTION2 

所以,mv輸出

錯誤03-JAN-2017十七時20分39秒的MV:不能移動 '/家/管理/' 到其自身的子目錄,「/家庭/管理/證書/管理'

有人可以給我一個提示我做錯了什麼? 謝謝。

+1

當你引用heredoc sigil時,你告訴本地解釋器不要在heredoc中擴展任何變量。 –

+0

...因此,它只是'USER'的* remote *值,而不是本地的,正在被使用.- –

+1

這實際上是爲什麼對你自己的變量使用全大寫名稱是不好的做法的一部分:它意味着你'使用與操作系統和shell工具共享的相同命名空間,因此您可能會不知不覺地覆蓋(或不知不覺地*使用*)變量,這些變量對系統的其他部分有意義。 –

回答

1

USER了遠程值,因爲USER總是有一個值:默認情況下,它是在all POSIX systems當前用戶帳戶。爲避免與系統定義的變量名稱衝突,應該爲自己的shell和環境變量使用小寫名稱(前者是因爲設置一個名稱與環境變量重疊的shell變量會隱式覆蓋後者)。

#!/bin/bash 
#  ^^^^ - not /bin/sh; printf %q (thus, eval-safe quoting) is a bash extension 

user=$1 
pfx=$8 

# Tell the shell to quote your variables to be eval-safe! 
printf -v user_q '%q' "$user" 
printf -v pfx_q '%q' "$pfx" 

# ...then you can use those eval-safe version in your heredoc 
run << SSHCONNECTION2 
    # because the values are self-quoted, don't put their expansions inside quotes 
    sudo mv /home/$user_q/$pfx_q /home/$user_q/certs/ 
SSHCONNECTION2 

注:

  • 的印記(SSHCONNECTION2)是有意加引號以允許發生膨脹。
  • 使用小寫變量名可以避免無意中與對shell或系統有意義的名稱發生衝突。

以上是有點可惜,因爲SSHCONNECTION2定界符的文字內容是不是可以安全地在shell直接運行代碼。考慮this answer instead

+0

謝謝我會試一試並接受你的回答,我對bash相當陌生,現在這是有道理的。 – Alex