Как определить, использует ли он zsh или bash
У меня вопрос о том, как определить, какую оболочку пользователь использует. Предположим, что script, если пользователь использует zsh, тогда поместите PATH в его .zshrc
, и если использование bash должно помещаться в .bashrc. И установите rvmrc соответственно.
#!/usr/bin/env bash
export PATH='/usr/local/bin:$PATH'" >> ~/.zshrc
source ~/.zshrc
Я пробовал следующее, но он не работает: (
if [[ $0 == "bash ]]; then
export PATH='/usr/local/bin:$PATH'" >> ~/.bashrc
elif [[ $0 == "zsh" ]]; then
export PATH='/usr/local/bin:$PATH'" >> ~/.zshrc
fi
# ... more commands ...
if [[ $0 == "bash ]]; then
[[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.bashrc
source ~/.bashrc
elif [[ $0 == "zsh" ]]; then
[[ -s '/Users/`whoami`/.rvm/scripts/rvm' ]] && source '/Users/`whoami`/.rvm/scripts/rvm'" >> ~/.zshrc
source ~/.zshrc
fi
Ответы
Ответ 1
Слово предупреждения: вопрос, который вы, кажется, задали, вопрос, который вы хотели задать, и вопрос, который вы должны задать, - это три разные вещи.
"Какая оболочка пользователь использует" является неоднозначной. Ваша попытка выглядит так, будто вы пытаетесь определить, какая оболочка выполняет ваш script. Это всегда будет то, что вы введете в строку #!
script, если только вы не хотите, чтобы ваши пользователи редактировали этот script, поэтому вам это не полезно.
То, что вы хотели спросить, я думаю, это то, что является любимой оболочкой пользователя. Это невозможно определить полностью надежно, но вы можете охватить большинство случаев. Проверьте переменную среды SHELL
. Если он содержит fish
, zsh
, bash
, ksh
или tcsh
, то любимая оболочка пользователя, вероятно, является оболочкой. Однако это неправильный вопрос для вашей проблемы.
Файлы типа .bashrc
, .zshrc
, .cshrc
и т.д. являются файлами инициализации оболочки. Они не подходят для определения переменных среды. Определенная там переменная среды будет доступна только в терминале, где пользователь запускает эту оболочку, а не в программах, запускаемых из графического интерфейса. Это определение также отменяет любую настройку, которую пользователь мог выполнить в ходе подсекции.
Правильное место для определения переменной среды находится в файле запуска сеанса. Это в основном не связано с выбором пользователем оболочки. К сожалению, нет единого места для определения переменных окружения. Во многих системах ~/.profile
будет работать, но это не универсально. См. https://unix.stackexchange.com/questions/4621/correctly-setting-environment и другие сообщения, которые я связываю там для более продолжительного обсуждения.
Ответ 2
Если оболочка Zsh, то определена переменная $ZSH_VERSION
. Аналогично для Bash и $BASH_VERSION
.
if [ -n "$ZSH_VERSION" ]; then
# assume Zsh
elif [ -n "$BASH_VERSION" ]; then
# assume Bash
else
# asume something else
fi
Однако эти переменные указывают только, какая оболочка используется для запуска вышеуказанного кода. Таким образом, вам придется source
этот фрагмент в оболочке пользователя.
В качестве альтернативы вы можете использовать переменную среды $SHELL
(которая должна содержать абсолютный путь к предпочтительной оболочке пользователя) и угадать оболочку из значения этой переменной:
case $SHELL in
*/zsh)
# assume Zsh
;;
*/bash)
# assume Bash
;;
*)
# assume something else
esac
Конечно, указанное выше не будет выполнено, если /bin/sh
является символической ссылкой на /bin/bash
.
Если вы хотите положиться на $SHELL
, безопаснее фактически выполнять некоторый код:
if [ -n "`$SHELL -c 'echo $ZSH_VERSION'`" ]; then
# assume Zsh
elif [ -n "`$SHELL -c 'echo $BASH_VERSION'`" ]; then
# assume Bash
else
# asume something else
fi
Последнее предложение может быть запущено из script независимо от того, какая оболочка используется для запуска script.
Ответ 3
Просто сделайте echo $0
он говорит -zsh
если это zsh, и -bash
если это bash
РЕДАКТИРОВАТЬ: Иногда он возвращает -zsh
а иногда zsh
и то же самое с Bash, IDK почему.
Ответ 4
Альтернативный вариант может не работать для всех оболочек.
for x in $(ps -p $$)
do
ans=$x
done
echo $ans
Ответ 5
У меня есть аналогичная проблема, рассчитанная на:
_shell="$(ps -p $$ --no-headers -o comm=)"
if [[ $_shell == "zsh" ]]; then
read -q -s "?Do it?: "
fi
elif [[ $_shell == "bash" || $_shell == "sh" ]]; then
read -n 1 -s -p "Do it [y/n] "
fi