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