我在iTerm(OS X)中使用zsh和oh-my-zsh。我遇到以下问题:
echo $ZSH_VERSION
返回4.3.11。upgrade_oh_my_zsh
。echo $ZSH_VERSION
再次返回4.3.11。brew install zsh
/ brew upgrade zsh
并获得Error: zsh-5.0.2 already installed
。echo $ZSH_VERSION
,也会返回4.3.11。如何让OMZ使用最新的zsh版本?
答案 0 :(得分:3)
我很高兴你找到了解决方案。一些说明:
oh-my-zsh
是zsh 配置框架。它不是“zsh”,而只是shell的配置文件。升级oh-my-zsh
和zsh
本身是两个独立的,基本上不相关的任务。 /bin/zsh
是一种解决方案。另一种方法是使用symlink - 可能从/usr/local/Cellar/zsh/5.0.2/bin/zsh-5.2.0
到您$PATH
的某个地方(如/usr/local/bin/
),并使用chsh
设置shell。符号链接的优点是您保留了所有二进制文件(因此您仍然拥有4.3
,5.0
,5.2
)。 chsh
无效的原因。 答案 1 :(得分: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
答案 2 :(得分: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周围添加双引号。