Я пытаюсь переключаться между zsh и bash.
По умолчанию у меня в качестве оболочки установлена zsh. Узнать это можно, введя:
echo $SHELL
и я получаю/bin/zsh
Однако я хочу открыть Bash, поэтому я набираю /bin/bash
; Я предполагаю, что сейчас я в bash, но если я выполню команду echo, $SHELL
я все равно получу/bin/zsh
Что случилось, пожалуйста?
решение1
SHELL — это переменная окружения, которая передается из bash в zsh при вызове zsh. SHELL не является одной изПараметры, устанавливаемые оболочкойв zsh, поэтому его значение остается неизменным.
bash$ SHELL=turtle zsh
zsh$ echo $SHELL
turtle
Чтобы убедиться, что вы находитесь в оболочке zsh, попробуйте:
echo $ZSH_NAME
echo $0
Переменная SHELL
традиционно устанавливается программой login
, «как указано в базе данных паролей». (Скопировано изЧто устанавливает переменную среды $SHELL?)
решение2
Многие оболочки устанавливают переменную версии при запуске.
bash
используйте BASH_VERSION и zsh
используйте ZSH_VERSION.
Установка известных значений для обеих переменных позволит надежно определить, какая оболочка была запущена:
BASH_VERSION=notbash ZSH_VERSION=notzsh sh -c 'echo "$BASH_VERSION $ZSH_VERSION"'
выведет notbash 5.3.1
, если sh - это zsh или 5.0.2(2)-release notzsh
sh - это bash.
К сожалению, ksh выдает ошибку сегментации при использовании KSH_VERSION со строковым значением.