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


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

  • Оболочка Борна (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Оболочка Korn (ksh)
  • Bourne Again shell (bash)

Вопросов:

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

228
2018-02-28 03:58


Источник


Как определить текущую оболочку, над которой я работаю? на stackoverflow.com - αғsнιη
@KasiyA Это также связано с askubuntu.com/questions/87853/... - d a i s y


Ответы:


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

echo $0

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

-bash

276
2018-02-28 04:03



является 0 переменная среды? - Mi_Onim
@Mi_Onim $ 0 - это имя текущего процесса. Если вы используете его внутри оболочки, он вернет имя оболочки. Если вы используете его внутри скрипта, это будет имя скрипта. - kingmilo
ЗАМЕТКА: это не будет работать для интерактивных csh, % echo $0 No file for $0. , но он работает для tcsh - Sergiy Kolodyazhnyy
Не работает, если используется символическая ссылка. подобно bash в виде sh - Anwar
@Anwar делает хороший момент, после того как вы получите имя оболочки из echo $0, ls -l `which <name>`  чтобы увидеть, символически ли она связана с другой бинарной оболочкой. - JivanAmara


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

echo $SHELL

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

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

echo "$$"

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

ps -p <PID>

Объединяя это:

ps -p "$$"

71
2018-02-28 04:06



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


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

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

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


15
2017-11-18 11:45



Это хорошая разница в других голосующих ответах. Спасибо. - Michael Hoffmann


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

echo "$SHELL"

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

/bin/bash

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


5
2018-02-28 04:02



/ bin / sh - это командный язык командной оболочки, а не оболочка Bourne, пожалуйста, отредактируйте свой ответ. - kingmilo
@kingmilo Нет /bin/sh ссылка в моем ответе - kos
@kol было до редактирования. Также обратите внимание, что $ SHELL - это оболочка по умолчанию для системы (или пользователя), которая обычно (но не обязательно) является оболочкой, которая фактически используется в любой момент. - kingmilo
@kingmilo Обратите внимание, что вопрос: «Когда я открываю терминал, какая оболочка открыта по умолчанию?» и ответ: «Если вы не изменили какую-либо конфигурацию, это должно быть Bash, потому что это оболочка по умолчанию на Ubuntu ", поэтому ответ подходит к вопросу - kos
@kingmilo Снова прочитав ответ, я думаю, что понимаю, что вас беспокоит, возможно, я не очень хорошо себя проявил. Я уточнил значение «в настоящее время» в своем ответе - kos


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

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

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

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

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


2
2018-04-06 04:00



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