从函数中改变全局“路径”?

时间:2015-01-09 20:46:44

标签: 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")

但这会产生错误

  

/Users/bdesham/.zshenv:8:缺少字符串的结尾

第8行是我正在调用的prepend_to_path_if_exists。究竟是什么导致了这个错误,我该如何使这个功能起作用?我在OS X 10.10.1上使用zsh 5.0.5。

1 个答案:

答案 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保留现有目录。