2017-05-10 54 views
0

我想使用rsync這樣的:殼牌水珠結果均以如果沒有響應

EXCLUDES=('*~' '*.cfg') 
rsync ${EXCLUDES[@]/#/--exclude=} SOURCE DEST 

預期的結果是:

rsync --exclude=*~ --exclude=*.cfg SOURCE DEST 

但是當水珠沒有結果的結果是:

rsync '--exclude=*~' '--exclude=*.cfg' SOURCE DEST 

我很喜歡單線解決方案${EXCLUDES[@]/#/--exclude=}。如何防止glob擴展引用結果?或者也許是另一種單線解決方案?

+0

爲什麼你認爲有引號?這是'set -x'輸出嗎?你能以程序輸出的方式給出預期的和實際的結果,而不是根據你認爲它應該相當於但相信它們不是(或至少是什麼讓你相信的)的命令? –

+0

_「如何防止glob擴展引用結果?」_這個問題還不清楚。請詳細說明。 – John1024

回答

1

我可以重現你描述這樣的行爲:

$ touch a~ b~ c.cfg 
$ EXCLUDES=('*~' '*.cfg') 
$ echo rsync ${EXCLUDES[@]/#/--exclude=} SOURCE DEST 
rsync --exclude=*~ --exclude=*.cfg SOURCE DEST 

如果我明白你問的問題,你想爲擴大排除的文件名。在這種情況下,使用方法:

$ EXCLUDES=(*~ *.cfg) 
$ echo rsync "${EXCLUDES[@]/#/--exclude=}" SOURCE DEST 
rsync --exclude=a~ --exclude=b~ --exclude=c.cfg SOURCE DEST 

或者,它可能是你在沒有匹配的文件,如擔心輸出的水珠:

$ rm -f a~ b~ c.cfg 
$ EXCLUDES=(*~ *.cfg) 
$ echo rsync "${EXCLUDES[@]/#/--exclude=}" SOURCE DEST 
rsync --exclude=*~ --exclude=*.cfg SOURCE DEST 

爲了防止那些出現水珠,用nullglob這樣的:

$ shopt -s nullglob 
$ EXCLUDES=(*~ *.cfg) 
$ echo rsync "${EXCLUDES[@]/#/--exclude=}" SOURCE DEST 
rsync SOURCE DEST 

nullglob導致無與倫比的水珠消失。

  1. 當使用EXCLUDES=('*~' '*.cfg'),不發生膨脹,因爲水珠是在引號中。如果你想擴展,刪除引號。

  2. 數組擴展${EXCLUDES[@]/#/--exclude=}應該用雙引號。如果沒有雙引號,分詞將對結果執行,如果任何文件名包含空格,將導致錯誤。