2016-08-12 41 views
0

的我有文件名,我想通過stow被忽略的陣列,例如構建一個外部程序的命令行標誌出的bash陣列

IGNORES=('post_install\.sh' 'dummy') 

(實際上,該名單是不固定的但從文件讀取並不總是具有相同的長度,所以像下面的硬編碼將無法工作)。

我形成命令行標誌出數組的像這樣

IGNORES=("${IGNORES[@]/#/--ignore=\'}") 
IGNORES=("${IGNORES[@]/%/\'}") 

當我做

stow -v "${IGNORES[@]}" -t $home $pkg 

然而,忽略不被平放尊重,但它並沒有抱怨無效的參數無論是。直接寫

stow -v --ignore='post_install\.sh' --ignore='ignore' -t $home $pkg 

雖然工作。

這兩種方式傳遞--ignore標誌有什麼區別,有什麼想法如何解決這個問題?據我的理解,"${IGNORES[@]}"應評估爲每個數組元素一個單詞,並具有預期的效果(我試圖刪除引號和索引與*陣列,但也無濟於事)。

謝謝!

+0

在'post_install.sh'中轉義'.'是不必要的,但是如果您沒有另外引用文件名則無害;在內部引號中,您正在向名稱添加文字反斜槓。 – chepner

+0

這是我需要驗證的一件事。 'man stow'表示這些名字被解釋爲perl正則表達式,它們需要在文件名的末尾匹配,所以我認爲我需要避開這個點才能使模式正確(儘管一個點當然會匹配任何包括一個點的字符,但那不是我想要的)。 – Wisperwind

+0

啊,是的,這是不同的。 – chepner

回答

1

因此,雖然寫的帖子,我碰到的解決方案:我添加了單引號這裏

IGNORES=("${IGNORES[@]/#/--ignore=\'}") 
IGNORES=("${IGNORES[@]/%/\'}") 

成爲文件名忽略的一部分,的確是一個名爲'ignore'文件將被跳過;只做

IGNORES=("${IGNORES[@]/#/--ignore=}") 

具有預期的效果。我仍然需要檢查如何科佩斯與數​​組元素的空間,但我的猜測是,它工作得很好,因爲用空格引用文字的必要性只源於分割一個完整的命令行成的話就像

stow -v --ignore='the file' -t $home $pkg 

VS

stow -v --ignore=the file -t $home $pkg 

這是不是上面和"${IGNORES[@]}"問題得到詞恰到好處。

+0

引用數組擴展是保護數組元素中空白的正確方法;的確,這是將數組添加到語言中的基本原理。 – chepner

相關問題