2012-08-16 133 views
0

這是這是造成問題,我的代碼的簡化位:猛砸變量命令

#!/bin/bash 

SRC=${BASH_ARGV[1]} 
DEST=${BASH_ARGV[0]} 

err="" 
RSYNC="rsync -Dgoptrl --exclude 'backup-info'" 

err=`$RSYNC "$SRC" "$DEST" 2>&1 | xargs -0`; 
#err=`rsync -Dgoptrl --exclude 'backup-info' "$SRC" "$DEST" 2>&1 | xargs -0`; 

rsync的副本的一切,但名稱爲備份信息的目錄沒有得到排除。然而,最後一行確實有效(即,它排除了備份信息)。他們對我來說看起來都一樣,對於爲什麼一個人工作而另一個不工作感到困惑。

謝謝, 灰

回答

2
BASH FAQ #50: "I'm trying to put a command in a variable, but the complex cases always fail!"

把命令在一個陣列,並執行該陣列。

RSYNC=(rsync -Dgoptrl --exclude 'backup-info') 
err=`"${RSYNC[@]}" "$SRC" "$DEST" 2>&1 | xargs -0`; 
+0

哇,那是一個快速反應!謝謝!這適用於我,但儘管閱讀您提到的文章,我仍然感到困惑。好吧,我得到的單引號是字面的,而不是語法的,但'備份信息'不包含空格,那麼爲什麼WordSplitting會將它分割? – Ash 2012-08-16 09:22:07

+0

@Ash Word拆分不會拆分'backup-info',但會拆分'備份信息'。你原來的代碼中發生的事情是,單引號是字面對待的(因爲它們在雙引號內),所以'rsync'看到的參數是'--exclude'''backup-info''。如果你有一個名爲「backup-info」的文件,它將被排除。 – Gilles 2012-08-16 10:07:47

+0

哦,我明白了。感謝吉爾。 – Ash 2012-08-17 03:11:54