Как проверить, какую оболочку я использую?

359

Я читал, что терминал - это не что иное, как оболочка, а Unix предоставляет различные варианты оболочек:

  • Оболочка Борна (ш)
  • C оболочка (csh)
  • TC shell (tcsh)
  • Скорлупа корн (кш)
  • Bourne Again shell (Баш)

Вопросов:

  • Когда я открываю окно терминала, какая оболочка открывается по умолчанию?
  • Как проверить, сколько снарядов установлено?
  • Как изменить оболочку, использованную в моей учетной записи?
LearNer969
источник
@KasiyA Это также связано с askubuntu.com/questions/87853/…
маргаритка
Обратите внимание, что терминал - это интерфейс к оболочке (который в свое время фактически являлся физическим интерфейсом), а оболочка не является терминалом - это интерпретатор команд. См. Также askubuntu.com/a/640105/295286
Сергей Колодяжный

Ответы:

429

Вы можете ввести следующую команду в своем терминале, чтобы увидеть, какую оболочку вы используете:

echo $0

Результат будет выглядеть примерно так, как показано ниже, если вы используете терминал bash ( Bourne Again Shell ):

-bash
kingmilo
источник
2
такое 0переменная окружения?
Mi_Onim
43
@Mi_Onim $ 0 - это имя запущенного процесса. Если вы используете его внутри оболочки, он вернет имя оболочки. Если вы используете его внутри скрипта, это будет имя скрипта.
Кингмило
2
ПРИМЕЧАНИЕ : это не будет работать для интерактивного csh. % echo $0 No file for $0., но это работает дляtcsh
Сергей Колодяжный
2
Не работает, если один символическая ссылка. Вроде bashкакsh
Анвар
9
@Anwar делает хорошую точку, после того, как вы получите имя оболочки из echo $0, ls -l `which <name>` чтобы увидеть , если он является символической ссылкой на другой двоичный файл оболочка.
ДживанАмара
121

Чтобы найти оболочку, установленную в среде по умолчанию, вы можете проверить значение SHELLпеременной среды:

echo $SHELL

Чтобы найти текущий экземпляр оболочки, найдите процесс (оболочку), имеющий PID текущего экземпляра оболочки.

Чтобы найти PID текущего экземпляра оболочки:

echo "$$"

Теперь, чтобы найти процесс, имеющий PID:

ps -p <PID>

Собираем это вместе:

ps -p "$$"
heemayl
источник
27
$ SHELL - это оболочка по умолчанию для системы (или пользователя), которая обычно (но не обязательно) является оболочкой, которая фактически используется в любой данный момент.
kingmilo
1
@kingmilo: Правильно, ответ изменен.
Heemayl
Я нашел это довольно полезным, когда переключался на пользователя через 'su - <username>', например, для настройки postgres, jenkins, ...
bully
1
echo $SHELLдал мне /bin/cshи ps -p $$дал мне 22673 pts/1 00:00:00 bash. Кингмило объяснил (выше), почему они не одинаковы.
18446744073709551615
@ 18446744073709551615 Я тоже не сказал, что они одинаковые. Пожалуйста, внимательно прочитайте ответ снова; обратите внимание на стандартные и текущие формулировки.
Heemayl
25

$SHELLдает вам оболочку по умолчанию. $0дает вам текущую оболочку.

Например: у меня bash в качестве оболочки по умолчанию, которую я использую для своего приложения терминала. Но для моего приложения iTerm2, я использую команду , как открывается окно: /bin/ksh.

Так что мой $0дает мне /bin/kshна iTerm2. $SHELLдает мне /bin/bashна iTerm2. $0, $SHELLДает мне /bin/bashна терминале

thenakulchawla
источник
2
Это хорошая неоднозначность других ответов с наибольшим количеством голосов. Спасибо.
Майкл Хоффманн
Для меня у меня установлен zsh, и это текущее значение по умолчанию, чтобы изменить на bash, все, что мне нужно сделать, набрать bashв терминале. Чтобы переключиться обратно на ЗШ, типаzsh
Юсуф Азад
8

Чтобы узнать, какая оболочка по умолчанию для вашего пользователя, вы можете запустить:

echo "$SHELL"

Например, если вы используете Bash, вы должны получить следующий вывод:

/bin/bash

Если вы не меняли конфигурацию, это должен быть Bash, поскольку Bash это оболочка по умолчанию в Ubuntu.

кос
источник
/ bin / sh - это командный язык оболочки, а не оболочка Bourne, пожалуйста, отредактируйте свой ответ.
kingmilo
@kingmilo В /bin/shмоем ответе нет упоминаний
kos
@kol было до редактирования. Также обратите внимание, что $ SHELL является оболочкой по умолчанию для системы (или пользователя), которая обычно (но не обязательно) является оболочкой, которая фактически используется в любой данный момент.
kingmilo
1
@kingmilo Читая ответ снова, я думаю, что понимаю, о чем ты беспокоишься, возможно, я не выразил себя хорошо. Я уточнил значение слова «в настоящее время» в своем ответе
Кос
1
@frederickjh рыба немного странная здесь. $$Переменная фактически определяется POSIX и будет работать на подавляющем большинстве оболочек. Рыба решила не следовать стандарту здесь, поэтому я думаю, что будет справедливо игнорировать его. Я могу подтвердить, что $$работает как положено в sh, dash, bash, zsh, ksh, ash, tcsh и csh. На самом деле, в верхней части головы я не могу думать ни о какой другой раковине, кроме рыбы, где она не работает.
Тердон
8

Другие ответы, как правило, используют специфические функции оболочки, но мы пытаемся выяснить, какую оболочку мы используем, поэтому они принимают решение проблемы. Например, ни один из ответов не будет работать на рыбу.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

Вместо этого используйте синтаксис $$ в вызове sh, но тогда мы ищем PPID, а не PID. Используйте PPID, чтобы найти cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Спасибо за улучшение @muru

Эван Бенн
источник
2
Вы можете использовать ppid=/, cmd=чтобы опустить заголовки (и так далее tail -1), и рассмотреть /proc/.../exeвозможность посмотреть, какой файл запускается (поскольку cmdвывод может быть обработан любым, кто запускал оболочку).
Муру
1
По-видимому, это не работает в busybox из-за несоответствия posix: ref: github.com/broadinstitute/cromwell/pull/…
Эван Бенн
4

Оригинальный пост задал три вопроса. Полученные ответы охватывают первый вопрос: «Когда я открываю окно терминала, какая оболочка открывается по умолчанию?» Они также отвечают на вопрос, который НЕ был задан, а именно: «Как я могу узнать, какая оболочка в настоящее время работает в терминале?» Однако, насколько я вижу, никто не ответил ни на второй, ни на третий первоначально заданный вопрос, а именно: «Как проверить, сколько оболочек установлено?». и "Как мне изменить оболочку, использованную в моей учетной записи?"

  • Ответить «Как проверить, сколько снарядов установлено?» следующая команда выведет список всех доступных оболочек:

кошка / etc / shells

Например, при установке Ubuntu 18.10 по умолчанию это дает:

# / etc / shells: допустимые логины

/ Бен / ш

/ Бен / тире

/ Бен / Баш

/ Бен / rbash

Однако по умолчанию sh является символической ссылкой на dash, в то время как rbash ссылается на bash с параметром -r («limited bash»), поэтому на самом деле существует только две оболочки, а не четыре, как предлагает приведенный выше список. Следующая команда покажет вам, являются ли какие-либо из перечисленных оболочек фактически символическими ссылками, и если да, то где они ссылаются: ls -l / bin

  • Теперь на вопрос "Как изменить оболочку, использованную в моей учетной записи?" Предполагая, что это означает «Как навсегда изменить оболочку по умолчанию, которую будет использовать терминал», на https://wiki.ubuntu.com/ChangingShells#Changing_your_login_shell_which_is_permanent есть ответ
Майкл Д
источник