Zsh 更改全局“;路径”;从函数内部?

Zsh 更改全局“;路径”;从函数内部?,zsh,Zsh,我的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") 但这就产生了错误

我的
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\u to\u path\u(如果存在)
。到底是什么导致了这个错误,我如何才能使这个函数工作?我在OS X 10.10.1上使用的是zsh 5.0.5。

您可以像往常一样调用函数,执行类似的命令(没有
()
):

zsh似乎试图将glob
prepend\u扩展到\u path\u(如果\u存在)(…)
,而不是调用函数


TL;DR:将元素预先添加到
$path
将通过一种有点神秘的方式完成:
(我不太确定下面的表格是否适合任何人。)

#`typeset-U`对数组的元素进行唯一化。
#这可能对$path有好处。
字体-U路径
#无条件地预先设置一些路径,
路径[1,0]=(\
$HOME/bin\
$HOME/sbin\
)
#然后过滤掉不必要的条目。
路径=(${^path}(-/N))
$path[x,0]=…
正在将元素预编(拼接)到从以下位置获取的数组:

这和VAR[1,0]=(…)是一样的吗?它真的“看起来”不太好 对我来说很像prepend

--格雷格·克兰德曼()

${^path}(-/N)
在每个
$path
元素上展开
-/N
。 (如果中没有
^
,将对数组的最后一个元素求值,因此在这种情况下必须求值。)

glob限定符激发
-/N
表示“符号链接及其指向的文件”(
-
)为“目录”(
/
)。当它与任何内容都不匹配时,不要引发错误(
N

简而言之,它将只为
$path
保留现有目录

prepend_to_path_if_exists "$HOME/bin"