2

我在 iTerm (OS X) 中使用 zsh 和 oh-my-zsh。我遇到以下问题:

  1. echo $ZSH_VERSION返回 4.3.11。
  2. 我运行upgrade_oh_my_zsh成功。
  3. echo $ZSH_VERSION再次返回 4.3.11。
  4. 我运行brew install zsh/brew upgrade zsh并得到一个Error: zsh-5.0.2 already installed.
  5. 然而,即使在我重新启动 iTerm 后,它也会echo $ZSH_VERSION返回 4.3.11。

如何让 OMZ 使用最新的 zsh 版本?

4

3 回答 3

3

我很高兴你找到了解决方案。一些注意事项:

  1. oh-my-zsh是一个zsh配置框架。它不是“zsh”,只是 shell 的配置文件。升级oh-my-zsh和升级zsh本身是两个独立的、基本上不相关的任务。
  2. 用新的二进制文件覆盖/bin/zsh是一种解决方案。另一种是使用符号链接- 可能从/usr/local/Cellar/zsh/5.0.2/bin/zsh-5.2.0到您$PATH(如/usr/local/bin/)中的某个地方,并使用chsh. 符号链接的优点是您保留了所有二进制文件(因此您仍然拥有4.3, 5.0, 5.2)。
  3. 这个问题可能会解释为什么chsh不起作用。
于 2013-10-03T14:50:55.793 回答
2

解决了这个问题。我/etc/paths的已经/usr/local/bin在顶部了。当我打开/usr/local/bin/我看到除了zsh,我也有zsh-5.2.0。我试过chsh -s /usr/local/bin/zsh-5.2.0了,但这没有帮助。我删除zsh并重命名zsh-5.2.0zsh-> 也无济于事。我看到zsh-5.2.0那是指向/usr/local/Cellar/zsh/5.0.2/bin/zsh-5.0.2,以前我看到原来zsh的指向是/bin/zsh。所以对我有帮助的是:

  • 打开/usr/local/Cellar/zsh/5.0.2/bin/-> 包含zshzsh-5.2.0
  • zsh从那里复制到/bin/并覆盖/bin/zsh
  • 重新启动 iTerm
于 2013-10-03T08:59:12.493 回答
1

我的 ~/.zshrc 中有以下内容。它将在给定的目录列表中找到一个可用的 zsh,按版本号对它们进行排序并执行最新的一个。

if [[ $- == *i* ]]; then
    arg=$(
        for dir in \
            /usr/local/bin \
            /usr/gnu/bin \
            /usr/sfw/bin \
            /bin \
            /usr/bin
        do
            arg=$dir/zsh

            # Make sure the shell is a readable, executable file.
            if [[ ! -f $arg || ! -r $arg || ! -x $arg ]]; then
                continue
            fi

            # Print sortable version number and path to shell.
            ver=$( $arg -c 'echo $ZSH_VERSION' 2>/dev/null )
            if [[ -n $ver ]]; then
                printf '%03u%03u%03u %s\n' $( echo $ver | tr '.' ' ' ) $arg
            fi
        done | sort -r | head -1 | cut -c11-
    )

    if [[ -n $arg && $arg != $SHELL ]]; then
        echo "Switching SHELL to $arg"
        export SHELL=$arg
        exec $SHELL -li
    fi
fi

如果你想让它搜索 PATH 变量的内容,你可以使用

for dir in $( echo "$PATH" | tr ':' ' ' ); do
    (...)

如果目录名称中有空格,则必须使用类似

printf '%s\n' "$PATH" | tr ':' '\n' | while read dir; do
    (...)

并在 $arg 和 $SHELL 某些地方添加双引号。

于 2014-01-23T08:55:03.630 回答