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

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

  • Раковина Борна (sh)
  • Оболочка C (csh)
  • Оболочка TC (tcsh)
  • Оболочка Korn (ksh)
  • Борн снова шелл (удар)

Вопросы:

  • Когда я открываю окно терминала, какая оболочка открывается по умолчанию?
  • Как мне проверить, сколько оболочек установлено?
  • Как мне изменить оболочку, используемую в моей учетной записи?

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

echo $0

Результат будет выглядеть примерно так, как показано ниже, если вы используете удар (Борн Снова Шелл) терминал:

-bash

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

echo $SHELL

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

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

echo "$$"

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

ps -p <PID>

Собирая все воедино:

ps -p "$$"

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

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

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

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

echo "$SHELL"

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

/bin/bash

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

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

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

    cat /etc/shells

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

    # /etc/shells: valid login shells/bin/sh/bin/dash /bin/bash/bin/rbash

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

  • Теперь перейдем к вопросу "Как мне изменить оболочку, используемую в моей учетной записи?" Предполагая, что это означает "Как мне навсегда изменить оболочку по умолчанию, которую будет использовать терминал", есть ответ здесь.

Чтобы ответить на ваш третий вопрос "Как мне изменить оболочку, используемую в моей учетной записи?", ответ заключается в использовании chsh.

Есть два режима:

  • интерактивный, и;
  • неинтерактивный.

От Смена оболочек - Изменение вашей оболочки входа в систему, которая является постоянной, и слегка перефразируя его:

Вы будете использовать программу под названием чшш. Существует интерактивный метод и неинтерактивный метод. Введите следующее в свой терминал:

ИНТЕРАКТИВНЫЙ МЕТОД

$ chsh

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

Следует соблюдать осторожность при изменении своей оболочки по умолчанию, поскольку возможно возникновение ошибки, которую может исправить только пользователь root (т.Е. системный администратор) (хотя квалифицированному пользователю должно быть легко исправить ее в домашней системе). В частности, важно сначала временно протестировать оболочку в текущем сеансе, а затем убедиться, что при внесении постоянного изменения вводится действительное имя оболочки.

НЕИНТЕРАКТИВНЫЙ МЕТОД

Я снова буду использовать csh в качестве примера.

$ chsh -s /bin/csh

То -s устанавливает его для вас без необходимости заходить в редактор, чтобы сделать это.

Как только это будет выполнено успешно, то echo $SHELL все равно скажут, что вы находитесь в той же оболочке, что и раньше. Однако вам необходимо выйти из системы и снова войти в систему, чтобы изменения вступили в силу. Теперь делай echo $SHELL. Вы должны увидеть, что он показывает новую оболочку.

Возможно, вы не захотите знать имя текущей оболочки (например -bash, bash, zsh и т.д., от echo $0), ни путь к исполняемому файлу оболочки по умолчанию (из echo $SHELL), а скорее путь к исполняемому файлу текущей оболочки (особенно полезно, например, если у вас установлено более одной версии Bash).

Для этого вы можете использовать lsof -p "$$" или с некоторым дополнительным кодированием для извлечения только необходимой информации:

lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n 1

Пример вывода для 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 вместо.

На одном из серверов, к которым я подключаюсь, оболочка входа в систему /bin/sh который является символической ссылкой на /bin/bash

Большинство ответов здесь дадут sh, что заставило бы OP считать, что это оболочка Bourne, а не GNU bash, за исключением этот это дает /bin/bash

Другим вариантом, который подходит для этого случая, является:

$ echo $SHELL/bin/sh$ ls -l /bin/shlrwxrwxrwx 1 root root 4 May 31 16:15 /bin/sh -> bash$ /bin/sh --helpGNU bash, version 4.2.10(1)Usage:  /bin/sh [GNU long option] [option] ...        /bin/sh [GNU long option] [option] script-file ...

Как определить текущую оболочку, над которой я работаю? на [stackoverflow.com ](http://stackoverflow.com /)

Пожалуйста, обратите внимание, что терминал является интерфейсом к оболочке (которая в какой-то момент фактически была физическим интерфейсом), а оболочка не является терминалом - это интерпретатор команд. Смотрите также command line - How do I check which terminal I am using? - Ask Ubuntu

@KasiyA Это также связано с http://askubuntu.com/questions/87853/what-is-default-shell-for-terminal