2013-10-03 3 views
1

Я использую zsh с oh-my-zsh в iTerm (OS X). Я столкнулся со следующей проблемой:Как сделать oh-my-zsh использовать последнюю версию 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?

ответ

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.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
3

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

  1. oh-my-zsh является основой конфигурации ЗШ . Это не «zsh», а только файлы конфигурации для оболочки. Модернизация oh-my-zsh и zsh сама по себе - две отдельные, в значительной степени несвязанные задачи.
  2. Перезапись /bin/zsh с новым двоичным кодом - одно решение. Другим является использование symlink - возможно, от /usr/local/Cellar/zsh/5.0.2/bin/zsh-5.2.0 до вашего $PATH (например, /usr/local/bin/) и установка оболочки с использованием chsh. Преимущество символической ссылки состоит в том, что вы сохранили все двоичные файлы (так что у вас все еще есть 4.3, 5.0, 5.2).
  3. This question может пролить свет на то, почему chsh не работал.
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 в некоторых местах.

Смежные вопросы