Як перевірити, яку оболонку я використовую?


356

Я читав, що термінал - це не що інше, як оболонка, і Unix надає різні смаки оболонок:

  • Оболонка Борна (ш)
  • Оболонка C (csh)
  • Оболонка TC (tcsh)
  • Оболонка кукурудзи (кш)
  • Оболонка Bourne Again (bash)

Запитання:

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


@KasiyA Це також пов’язано з askubuntu.com/questions/87853/…
Дейзі

Зверніть увагу, що термінал - це інтерфейс до оболонки (який в один момент був фактично фізичним інтерфейсом), а оболонка не є термінальною - це інтерпретатор команд. Дивіться також askubuntu.com/a/640105/295286
Сергій Колодяжний

Відповіді:


425

Ви можете ввести наступну команду у своєму терміналі, щоб побачити, яку оболонку ви використовуєте:

echo $0

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

-bash

2
це 0змінна середовище?
Mi_Onim

43
@Mi_Onim $ 0 - це назва запущеного процесу. Якщо ви використовуєте його всередині оболонки, то він поверне назву оболонки. Якщо ви використовуєте його всередині сценарію, це буде назва сценарію.
kingmilo

2
ПРИМІТКА : це не працюватиме для інтерактивних csh. % echo $0 No file for $0., але це працюєtcsh
Сергій Колодяжний,

2
Не працює, якщо одно з символьних посилань. Як bashіsh
Анвар

9
@Anwar робить хороший момент, коли ви отримаєте ім'я оболонки echo $0, ls -l `which <name>` щоб побачити, чи вона посилається на інший бінарний оболонку.
JivanAmara

121

Щоб знайти оболонку у середовищі за замовчуванням, ви можете перевірити значення SHELLзмінної середовища:

echo $SHELL

Щоб знайти поточний екземпляр оболонки, знайдіть процес (оболонку), що має PID поточного екземпляра оболонки.

Щоб знайти PID поточного екземпляра оболонки:

echo "$$"

Тепер, щоб знайти процес із PID:

ps -p <PID>

Збираючи його разом:

ps -p "$$"

27
$ SHELL - оболонка за замовчуванням для системи (або користувача), яка зазвичай (але не обов'язково) оболонка, яка фактично використовується в будь-який момент.
kingmilo

1
@kingmilo: Правильно, відповідь змінено.
heemayl

Я вважаю це досить корисним при переході на користувача через "su - <ім'я користувача>", наприклад, для налаштування postgres, jenkins, ...
хуліган

1
echo $SHELLдав /bin/cshі ps -p $$дав мені 22673 pts/1 00:00:00 bash. Кінгміло пояснив (вище), чому вони не однакові.
18446744073709551615

@ 18446744073709551615 Я ще не сказав, що вони однакові. Будь ласка, ще раз уважно прочитайте відповідь; відзначте за замовчуванням та поточні формулювання.
heemayl

25

$SHELLнадає оболонку за замовчуванням. $0дає поточну оболонку.

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

Тож мій $0дає мені /bin/kshна iTerm2. $SHELLдає мені /bin/bashна iTerm2. $0, $SHELLдає мені /bin/bashна Термінал


2
Це гарна розбіжність з іншими відповідями, які голосують у топі. Дякую.
Майкл Гофман

Для мене в мене встановлено zsh, і це поточний типовий параметр, щоб змінити на bash, все, що мені потрібно зробити, наберіть bashу терміналі. Щоб повернутися до zsh, наберітьzsh
Yousuf Azad

8

Щоб знати, яка оболонка за замовчуванням для вашого користувача, ви можете запустити:

echo "$SHELL"

Наприклад, якщо ви використовуєте Bash, ви повинні отримати такий результат:

/bin/bash

Якщо ви не змінили жодної конфігурації, це повинен бути Bash, оскільки Bash - це оболонка за замовчуванням у Ubuntu.


/ bin / sh - мова командної оболонки, а не оболонка Борна, відредагуйте свою відповідь.
kingmilo

@kingmilo У /bin/shмоїй відповіді немає посилань
kos

@kol там було до редагування. Також зверніть увагу, що $ SHELL - оболонка за замовчуванням для системи (або користувача), яка зазвичай (але не обов'язково) оболонка, яка фактично використовується в будь-який момент.
kingmilo

1
@kingmilo Прочитавши ще раз відповідь, я думаю, що я розумію, що вас хвилює, напевно, я не висловив себе добре. Я уточнив значення "наразі" у своїй відповіді
kos

1
@frederickjh риба тут трохи дивна. $$Мінлива фактично визначається POSIX і буде працювати на переважній більшості оболонок. Риба вирішила тут не слідувати стандарту, тому я думаю, що це справедливо ігнорувати. Я можу підтвердити, що $$працює, як очікується, в sh, dash, bash, zsh, ksh, ash, tcsh та csh. Насправді, вгорі голови я не можу придумати жодної іншої оболонки, крім риби, де вона не працює.
terdon

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
Мабуть, це не працює в зайнятому ящику, через невідповідність позі: ref: github.com/broadinstitute/cromwell/pull/…
Еван Бенн

4

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

  • Відповісти "Як перевірити, скільки встановлено оболонок?" наступна команда перелічить усі доступні оболонки:

кішка / тощо / мушлі

Наприклад, при встановленні Ubuntu 18.10 за замовчуванням це дає:

# / etc / shell: дійсні оболонки для входу

/ бін / ш

/ бін / тире

/ бін / баш

/ бін / рбаш

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

  • Тепер для запитання "Як змінити оболонку, використану з мого облікового запису?" Якщо припустити, що це означає "Як я назавжди зміню оболонку за замовчуванням, яку використовуватиме термінал", на https://wiki.ubuntu.com/ChangingShells#Changing_your_login_shell_which_is_permanent є відповідь.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.