2017-01-16 24 views
1

我寫了下面一個bash腳本:的Rsync並引用

SRC="dist_serv:$HOME/www/" 
DEST="$HOME/www/" 
OPTIONS="--exclude 'file.php'" 
rsync -Cavz --delete $OPTIONS $SRC $DEST 

rsync的失敗,我想不通爲什麼,但它似乎是關係到$ OPTIONS變量(它的工作原理,當我刪除它)。我試着用一個反斜槓(其他的東西)逃避這個空間,但沒有奏效。 的錯誤信息是:

rsync: mkdir "/home/xxx/~/public_html/" failed: No such file or directory (2) 

我想引用變量,會拋出另一個錯誤(我的變量$ OPTIONS「未知的選項」):

rsync: --exclude 'xxx': unknown option 
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6] 

回答

0

你不應該把$在前面在爲它們分配值時使用變量名稱。 SRC是一個變量,$SRC是它擴展的值。

此外,~沒有擴展到您的主目錄的路徑,當你把它放在引號中。在腳本中使用$HOME通常會更好,因爲此變量的行爲類似於變量,而~不會。

時常引用變量擴展:

rsync -Cavz --delete "$OPTIONS" "$SRC" "$DEST" 

除非有一些理由不(有很少的)。否則,shell將執行分詞。

用戶@Fred指出,你不能使用雙引號$OPTIONS(在下面的評論),但是如果你使用OPTIONS='--exclude="file.php"'(注意=)也應該沒問題。

+0

選項變量不能被引用,因爲它包含兩個詞語,並引用將防止它們被分裂解釋該命令時(它們將被認爲是一個單一的字符串)。在這種情況下,不引用OPTIONS將會起作用,因爲它不包含任何空格,但它不是一個通用的解決方案。 – Fred

+0

當然是回覆:變量賦值!編輯我的問題... – mrtnmgs

+1

@immicile如果您還可以提到您在問題中從'rsync'中獲得的確切錯誤消息,那將會有很大幫助! – Kusalananda

0

我發現一種技術是無價的,它使用位置參數使其更容易處理選項列表。

當您將選項放入變量(例如您的OPTIONS變量)中時,您需要找到一種方法在引用變量時引用引號,並省略引號。它可以工作,但是你總是從一個難以調試的故障中輸入一個錯字。

請改爲嘗試以下操作。

set -- -Cavz --delete 
set -- "[email protected]" --exclude "file.php" 
set -- "[email protected]" "dist_serv:~/www/" 
set -- "[email protected]" "~/www/" 
rsync "[email protected]" 

當然,在這種情況下,一切都可以在同一行,但在許多情況下會出現的條件表達式,這樣,例如,你可以省略一個給定的選項,或選擇差異文件工作用。好的是,您總是使用與您在單個命令行中使用的引用相同的引用,這都要歸功於"[email protected]"的魔力,它避免了引用(或引用)任何特定變量。

如果實際的位置參數阻礙,可以將它們放在變量中,或者創建一個函數來隔離上下文,以避免在他們關心的地方觸摸它們。

我一直都在使用這個技巧,並且由於引用了引起問題的值,我將其作爲參數傳遞給命令,因此我已經停止拉出頭髮。

使用數組可以獲得類似的結果。

declare -a ARGUMENTS=() 
ARGUMENTS=(-Cavz --delete) 
ARGUMENTS+=(--exclude "file.php") 
ARGUMENTS+=("dist_serv:~/www/") 
ARGUMENTS+=("~/www/") 
rsync "${ARGUMENTS[@]}" 
+0

這是一個很好的解決方法,但我的腳本已經使用位置參數,它們會被覆蓋。 – mrtnmgs

+0

我已經添加了一個基於數組的解決方案,可以在不使用位置參數的情況下生成相似的結果。 – Fred