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似乎试图将globprepend\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"