2015-01-09 43 views
0

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。

回答

2

你可以调用函数的,像这样平常的命令执行(不()):

prepend_to_path_if_exists "$HOME/bin" 

看来,zsh的尝试展开水珠prepend_to_path_if_exists(…)而不是调用函数。


TL; DR:前面加上emelemnts到$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] =(...)?它并不真正“看起来”很像我之前所说的那样。

- 格雷格Klanderman(http://www.zsh.org/mla/workers/2013/msg00031.html

${^path}(-/N)扩展了每个$path元件glob qualifires-/N。 (无^parameter expansion,数组的最后一个元素将被评估,因此它是在这种情况下必须的。)

的水珠qualifires -/N意味着“符号链接和它们指向的文件”(-)的“目录”(/)。而当它不匹配任何东西时不会引发错误(N)。

简而言之,它只会保留现有的目录$path