2016-08-12 40 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

相关问题