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

Changing the global “path” from within a function?

我的 zshenv 文件有一堆行

if [[ -d "$HOME/bin" ]]; then
    path=($HOME/bin $path)
fi

我想我会试着把这个模式分解成一个函数。我将其替换为

function prepend_to_path_if_exists() {
    if [[ -d  ]]; then
        path=( $path)
    fi
}
prepend_to_path_if_exists("$HOME/bin")

但这给出了错误

/Users/bdesham/.zshenv:8: missing end of string

第 8 行是我调用的行 prepend_to_path_if_exists。到底是什么导致了这个错误,我怎样才能让这个功能起作用?我在 OS X 10.10.1.

上使用 zsh 5.0.5

您可以像这样像通常的命令执行一样调用函数(没有 ()):

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]=… 将元素添加(拼接)到从下面获取的数组中:

So that's the same as VAR[1,0]=(...) ? It doesn't really "look" very much like prepend to me.

-- Greg Klanderman (http://www.zsh.org/mla/workers/2013/msg00031.html)

${^path}(-/N) 在每个 $path 元素上扩展了 glob qualifires -/N。 (如果 parameter expansion 中没有 ^,将计算数组的最后一个元素,因此在这种情况下它是强制性的。)

glob qualifires -/N 表示 "symbolic links and the files they point to"(-) "directory"(/)。当它不匹配任何东西时不会引发错误 (N).

简而言之,它将仅保留 $path.

的现有目录