2013-10-03 42 views
1

我在iTerm(OS X)中使用帶有oh-my-zsh的zsh。我遇到以下問題:如何使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.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
3

我很高興你已經找到了解決辦法。一些注意事項:

  1. oh-my-zsh是zsh的配置框架。它不是「zsh」,僅僅是shell的配置文件。升級oh-my-zshzsh本身是兩個獨立的,基本上不相關的任務。
  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的某些位置添加雙引號。

相關問題