как узнать, использует ли он zsh или bash - PullRequest
46 голосов
/ 28 марта 2012

У меня вопрос о том, как определить, какую оболочку использует пользователь. Предположим, скрипт, который, если пользователь использует 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

Ответы [ 5 ]

97 голосов
/ 28 марта 2012

Если оболочкой является 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

Последнее предложение можно запустить из скрипта независимо от того, какая оболочка используется для запуска скрипта.

40 голосов
/ 11 октября 2014

Просто сделай echo $0 он говорит -zsh, если это zsh и -bash, если это bash

РЕДАКТИРОВАТЬ: иногда он возвращает -zsh, а иногда zsh и то же самое с bash, idk почему.

27 голосов
/ 29 марта 2012

Слово предупреждения: вопрос, который вы, похоже, задавали, вопрос, который вы хотели задать, и вопрос, который вы должны были задать, - это три разные вещи.

«Какую оболочку использует пользователь»неоднозначный.Ваша попытка выглядит так, как будто вы пытаетесь определить, какая оболочка выполняет ваш скрипт.Это всегда будет то, что вы положите в строку #! сценария, если только вы не хотели, чтобы ваши пользователи редактировали этот сценарий, так что это бесполезно для вас.

Что вы хотели спросить, ядумаю, что это любимая оболочка пользователя.Это нельзя определить полностью достоверно, но вы можете охватить большинство случаев.Проверьте переменную окружения SHELL.Если он содержит fish, zsh, bash, ksh или tcsh, то любимой оболочкой пользователя, вероятно, является эта оболочка.Однако это неправильный вопрос для вашей проблемы.

Файлы типа .bashrc, .zshrc, .cshrc и т. Д. Являются файлами инициализации оболочки.Они не являются подходящим местом для определения переменных среды.Переменная среды, определенная там, будет доступна только в терминале, где пользователь запускает эту оболочку, а не в программах, запускаемых из графического интерфейса.Определение также переопределит любую настройку, которую пользователь мог выполнить в подсессии.

Правильное место для определения переменной среды находится в файле запуска сеанса.Это в основном не связано с выбором оболочки пользователем.К сожалению, нет единого места для определения переменных среды.На многих системах ~/.profile будет работать, но это не универсально.См. https://unix.stackexchange.com/questions/4621/correctly-setting-environment и другие посты, на которые я ссылаюсь, для более подробного обсуждения.

2 голосов
/ 29 марта 2012

Альтернатива, может работать не для всех оболочек.

for x in $(ps -p $$)
do
  ans=$x
done
echo $ans
0 голосов
/ 24 января 2014

У меня возникла аналогичная проблема:

_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                                                                                                                                               
...