Как заставить oh-my-zsh использовать последнюю версию zsh?

Я использую zsh с oh-my-zsh в iTerm (OS X). Я сталкиваюсь со следующей проблемой:

  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.

Как заставить ОМЗ использовать последнюю версию zsh?


person Alexander    schedule 03.10.2013    source источник


Ответы (3)


Я рад, что вы нашли решение. Некоторые примечания:

  1. oh-my-zsh – это структура конфигурации zsh. Это не «zsh», а просто файлы конфигурации для оболочки. Обновление 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 не не работает.
person simont    schedule 03.10.2013

Решил проблему. Мой /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.0 в zsh -> тоже безрезультатно. Я увидел, что 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/ -> содержал как zsh, так и zsh-5.2.0.
  • скопировал zsh оттуда в /bin/ и перезаписал /bin/zsh
  • перезапустил iTerm
person Alexander    schedule 03.10.2013

У меня есть следующее в моем файле ~/.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 в некоторых местах.

person Peter John Acklam    schedule 23.01.2014