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

Вопрос или проблема

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

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

Вопросы:

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

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

echo $0

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

-bash

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

echo $SHELL

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

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

echo "$$"

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

ps -p <PID>

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

ps -p "$$"

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

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

Так что мой
$0 даёт мне /bin/ksh в iTerm2.
$SHELL даёт мне /bin/bash в iTerm2.
$0,$SHELL даёт мне /bin/bash в Terminal

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

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

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

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

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

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

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

    cat /etc/shells
    

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

    # /etc/shells: допустимые оболочки для входа
    /bin/sh
    /bin/dash 
    /bin/bash
    /bin/rbash
    

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

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

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

echo "$SHELL"

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

/bin/bash

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

Вы, возможно, не хотите знать имя текущей оболочки (например, -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.

ИЗМЕНЕНИЕ 1: Если вам нужно учитывать возможные пробелы в пути к оболочке, используйте lsof -p "$$" | grep -m 1 txt | xargs -n 1 | tail -n +9 | xargs вместо этого.

ИЗМЕНЕНИЕ 2: Еще один способ увидеть исполняемую оболочку, на этот раз не используя lsof, это ls -l "/proc/$$/exe".

Превращая это в команду, которая не требует lsof, позволяет учитывать возможные пробелы в пути исполняемого файла оболочки и позволяет учитывать возможные псевдонимы ls, мы получаем:

"$(which ls)" -l "/proc/$$/exe" | xargs -n 1 | tail -n +11 | xargs

Обратите внимание, что эта последняя версия с /proc/$$ не работает на macOS, тогда как версии с lsof работают, а также на любом Linux с установленным lsof.

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

Существует два режима:

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

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

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

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

$ chsh

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

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

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

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

$ chsh -s /bin/csh

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

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

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

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

Еще один вариант, который работает в данном случае, это:

$ echo $SHELL
/bin/sh

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 May 31 16:15 /bin/sh -> bash

$ /bin/sh --help
GNU bash, версия 4.2.10(1)
Использование:  /bin/sh [GNU длинная опция] [опция] ...
        /bin/sh [GNU длинная опция] [опция] скрипт-файл ...

Ответ или решение

Чтобы определить, какой именно шелл вы используете, и ответить на ваши вопросы, давайте рассмотрим все пункты по порядку.

1. Как проверить, какой шелл я использую?

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

  • Для получения имени текущего шелла:

    echo $0

    Вывод может быть, например, -bash, что указывает на то, что вы используете Bash (Bourne Again Shell).

  • Для получения пути к исполняемому файлу вашего текущего шелла:

    echo "$SHELL"

    Команда echo "$SHELL" покажет путь к вашему предустановленному шеллу (например, /bin/bash).

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

    ps -p $$

    Это покажет информацию о процессе шелла с его PID (идентификатором процесса).

2. Как проверить, сколько шеллов установлено?

Вы можете проверить, какие шеллы установлены на вашей системе, выполнив:

cat /etc/shells

Эта команда выведет список доступных шеллов. Например, вывод может выглядеть следующим образом:

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

Обратите внимание, что некоторые из этих шеллов могут быть символическими ссылками. Чтобы узнать, какие именно шеллы являются символическими ссылками, выполните:

ls -l /bin

3. Как изменить шелл для своей учетной записи?

Для изменения предустановленного шелла можно использовать утилиту chsh (change shell). У вас есть два варианта изменения:

  • Интерактивный способ:
    В командной строке введите:
chsh

Вам будет предложено ввести ваш пароль и затем указать полный путь к желаемому новому шеллу.

  • Неинтерактивный способ:
    Вы можете напрямую указать новый шелл, выполнив следующую команду, заменив /bin/new_shell на путь к новому желаемому шеллу:
chsh -s /bin/new_shell

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

echo "$SHELL"

Чтобы убедиться, что новый шелл установлен корректно.

Примечания

  • Пожалуйста, будьте осторожны при изменении вашего шелла, так как неверная конфигурация может привести к тому, что вы не сможете запустить терминал. Рекомендуется сначала протестировать новый шелл в текущей сессии перед тем, как менять его на постоянной основе.
  • Если ваш пользователь использует символические ссылки для шеллов, эти настройки могут повлиять на то, как вы увидите свой активный шелл. Например, /bin/sh может быть символической ссылкой на /bin/bash.

Следуя этим рекомендациям, вы сможете успешно определить и изменить шелл в вашем терминале.

Оцените материал
Добавить комментарий

Капча загружается...