2014-02-26 41 views
1

我一直在使用rsync進行增量備份的備份腳本。從bash腳本運行時出現Rsync語法錯誤

我已經手動測試以下rsync命令,它運行並完成備份沒有錯誤:

rsync -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/ 

但是當我跑在我的備份腳本相同的命令時,它給了我下面的錯誤:

rsync: -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/: unknown option 
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6] 

我跑我的腳本bash的-x弄清楚到底是什麼發送到控制檯,這裏是被打印的內容:

+ rsync '-aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/' 

有人看到有什麼問題嗎?我無法找到任何會導致語法錯誤的東西。

編輯: 這裏是我在腳本中的實際代碼,這是一個非常大的腳本,所以是一些變量沒有在這裏定義,但你明白了。

mkdir -p "/backup/$HOST/$NAME/$TODAY" 
#source directory 
SRC="$MNT" 
#link directory 
LNK="/backup/$HOST/$NAME/$LAST/" 
#target directory 
TRG="/backup/$HOST/$NAME/$TODAY/" 
#rsync options 
OPT1="-aAXv --delete --progress --link-dest=$LNK" 

#run the rsync command 
echo "rsync $OPT1 $SRC $TRG" 
rsync "$OPT1 $SRC $TRG" > /var/log/backup/backup.rsync.log 2>&1 
+0

爲什麼腳本的'bash -x'輸出中'rsync'選項有單引號?你能否在你的問題中包含你用來調用'rsync'的簡單語句? –

+3

通常是一個前導的'+'符號和單引號字符串是'set -x'顯示所有var擴展和字符串引用的行的方式,其中所有'「...」'現在都被「煮沸」到' 」 ...''(單引號字符串)。我認爲你是對的,缺少某些東西,我猜想O.P.正在做類似'rOpts =「 - aXV - 刪除...」; rsync「$ rOpts」'。因此錯誤msg'未知選項',祝大家好運。 – shellter

+0

如果@shellter是正確的,你的第一站應該是[BashFAQ#50:我想在一個變量把一個命令,但是複雜的情況下總是失敗(http://mywiki.wooledge.org/BashFAQ/ 050) –

回答

5

你是通過你的選項列表作爲一個參數,當需要爲參數的列表傳遞它。通常,您應該使用bash中的數組來保存您的參數,以防其中任何一個包含空格。嘗試以下方法:

mkdir -p "/backup/$HOST/$NAME/$TODAY" 
#source directory 
SRC="$MNT" 
#link directory 
LNK="/backup/$HOST/$NAME/$LAST/" 
#target directory 
TRG="/backup/$HOST/$NAME/$TODAY/" 
#rsync options 
OPTS=("-aAXv" "--delete" "--progress" "--link-dest=$LNK") 

#run the rsync command 
echo "rsync $OPT1 $SRC $TRG" 
rsync "${OPTS[@]}" "$SRC" "$TRG" > /var/log/backup/backup.rsync.log 2>&1 

陣列膨脹${OPTS[@]},引用時,經過特殊處理的作爲參數的序列,其中的每一個被單獨引用保存在各個元件的任何空白或特殊字符。如果arr=("a b" c d),然後echo "${arr[@]}"相同

echo "a b" "c" "d" 

而不是

echo "a b c d" 

這不會在shell工作不支持數組,但隨後,陣列被髮明出來,因爲有並不是一種安全的方式(即,不使用eval)來處理這個沒有它們的用例。

+0

完美,謝謝! – KroniK907

1

此:

rsync "$OPT1 $SRC $TRG" 

通過集中在一起作爲一個參數,rsync不知道如何處理所有的預期參數。

試試這個:

rsync ${OPT1} ${SRC} ${TRG} 
1

@chepner建議的方法在我的Mac OS X(10.9.4)上不起作用,但是eval做到了。

eval rsync "$OPT1 $SRC $TRG"