Подтвердить что ты не робот

Как определить, использует ли он 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
4b9b3361

Ответ 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