$SHELL дает вам оболочку по умолчанию.$0 дает вам текущую оболочку.
Например: У меня есть bash в качестве оболочки по умолчанию, которую я использую для своего терминального приложения. Но для моего приложения iTerm2 я использую команду при открытии окна: /bin/ksh.
Так что мой $0 дает мне /bin/ksh на iTerm2.$SHELL дает мне /bin/bash на iTerm2.$0,$SHELL дает мне /bin/bash на терминале
Другие ответы, как правило, используют специфические функции оболочки, но мы пытаемся выяснить, какую оболочку мы используем, поэтому они предполагают ответ на проблему. Например, ни один из ответов не будет работать с рыбой.
sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p
Вместо этого используйте синтаксис $$ при вызове sh, но тогда мы ищем PPID, а не PID. Используйте PPID, чтобы найти cmd.
В первоначальном посте было задано три вопроса. Приведенные ответы действительно охватывают первый вопрос: "Когда я открываю окно терминала, какая оболочка открывается по умолчанию?" Они также отвечают на вопрос, который НЕ был задан, а именно: "Как я могу узнать, какая оболочка в данный момент запущена в терминале?" Однако, насколько я вижу, никто не ответил ни на второй, ни на третий первоначально заданные вопросы, а именно: "Как мне проверить, сколько оболочек установлено?" и "Как мне изменить оболочку, используемую в моей учетной записи?"
Чтобы ответить на вопрос "Как мне проверить, сколько оболочек установлено?" следующая команда отобразит список всех доступных оболочек:
cat /etc/shells
Например, при установке Ubuntu 18.10 по умолчанию это дает:
Однако по умолчанию sh является символической ссылкой на dash, в то время как rbash ссылается на bash с опцией -r ("ограниченный bash"), поэтому на самом деле существует только две оболочки, а не четыре, как следует из приведенного выше списка. Следующая команда покажет вам, являются ли какие-либо из перечисленных оболочек на самом деле символическими ссылками, и если да, то на что они ссылаются:ls -l /bin
Теперь перейдем к вопросу "Как мне изменить оболочку, используемую в моей учетной записи?" Предполагая, что это означает "Как мне навсегда изменить оболочку по умолчанию, которую будет использовать терминал", есть ответ здесь.
Вы будете использовать программу под названием чшш. Существует интерактивный метод и неинтерактивный метод. Введите следующее в свой терминал:
ИНТЕРАКТИВНЫЙ МЕТОД
$ chsh
В результате появляется краткое диалоговое окно, в котором пользователю сначала предлагается ввести пароль, а затем полный путь к желаемой новой оболочке.
Следует соблюдать осторожность при изменении своей оболочки по умолчанию, поскольку возможно возникновение ошибки, которую может исправить только пользователь root (т.Е. системный администратор) (хотя квалифицированному пользователю должно быть легко исправить ее в домашней системе). В частности, важно сначала временно протестировать оболочку в текущем сеансе, а затем убедиться, что при внесении постоянного изменения вводится действительное имя оболочки.
НЕИНТЕРАКТИВНЫЙ МЕТОД
Я снова буду использовать csh в качестве примера.
$ chsh -s /bin/csh
То -s устанавливает его для вас без необходимости заходить в редактор, чтобы сделать это.
Как только это будет выполнено успешно, то echo $SHELL все равно скажут, что вы находитесь в той же оболочке, что и раньше. Однако вам необходимо выйти из системы и снова войти в систему, чтобы изменения вступили в силу. Теперь делай echo $SHELL. Вы должны увидеть, что он показывает новую оболочку.
Возможно, вы не захотите знать имя текущей оболочки (например -bash, bash, zsh и т.д., от echo $0), ни путь к исполняемому файлу оболочки по умолчанию (из echo $SHELL), а скорее путь к исполняемому файлу текущей оболочки (особенно полезно, например, если у вас установлено более одной версии Bash).
Для этого вы можете использовать lsof -p "$$" или с некоторым дополнительным кодированием для извлечения только необходимой информации:
Пример вывода для Bash, установленного через Homebrew:
/usr/local/Cellar/bash/5.1.8/bin/bash
или для Zsh:
/bin/zsh
Вышесказанное отличается от echo $SHELL, как потому, что вышеизложенное предназначено для оболочки, которая в данный момент запущена, а не для оболочки пользователя по умолчанию, а также потому, что вышеизложенное дает исполняемый файл после расширения любых символических ссылок. Например. для той же установки Bash, что и выше, echo $SHELL дает /usr/local/bin/bash.
РЕДАКТИРОВАТЬ: Если вам нужно разрешить возможные пробелы в пути оболочки, используйте lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs вместо.
Пожалуйста, обратите внимание, что терминал является интерфейсом к оболочке (которая в какой-то момент фактически была физическим интерфейсом), а оболочка не является терминалом - это интерпретатор команд. Смотрите также command line - How do I check which terminal I am using? - Ask Ubuntu