我的zshenv
文件有很多行,比如
if [[ -d "$HOME/bin" ]]; then
path=($HOME/bin $path)
fi
我以为我会尝试将这种模式考虑到一个函数中。我用
替换了它function prepend_to_path_if_exists() {
if [[ -d $1 ]]; then
path=($1 $path)
fi
}
prepend_to_path_if_exists("$HOME/bin")
但这会产生错误
/Users/bdesham/.zshenv:8:缺少字符串的结尾
第8行是我正在调用的prepend_to_path_if_exists
。究竟是什么导致了这个错误,我该如何使这个功能起作用?我在OS X 10.10.1上使用zsh 5.0.5。
答案 0 :(得分:2)
您可以像通常的命令执行一样调用函数(没有()
):
prepend_to_path_if_exists "$HOME/bin"
似乎zsh尝试扩展glob prepend_to_path_if_exists(…)
而不是调用函数。
TL; DR:将问题预先添加到$path
将通过一种神秘的方式实现:
(我不太确定以下形式对任何人都有好处。)
# `typeset -U` uniqify the elements of array.
# It could be good for $path.
typeset -U path
# prepending some paths unconditionally,
path[1,0]=(\
$HOME/bin \
$HOME/sbin \
)
# then filtering out unnecessary entries afterward.
path=(${^path}(-/N))
$path[x,0]=…
在从下面取出的数组前面(拼接)元素:
这与VAR [1,0] =(...)相同?它并没有真正"看起来"非常 很像是在我之前。
- Greg Klanderman(http://www.zsh.org/mla/workers/2013/msg00031.html)
${^path}(-/N)
扩展了每个-/N
元素的glob qualifires $path
。
(parameter expansion中没有^
,将评估数组的最后一个元素,因此在这种情况下它是必需的。)
glob限定符-/N
表示"符号链接及其指向的文件"(-
)"目录"(/
)。当它不匹配时,不会引发错误(N
)。
简而言之,它只会为$path
保留现有目录。