Понимание оболочки Shell в Linux
03.01.2022Оболочка — это не просто интерфейс командной строки. Это сложная интерактивная работающая программа. Ввод команд и использование оболочки для запуска скриптов может вызвать некоторые интересные и запутанные проблемы. Понимание процесса оболочки и его взаимосвязей поможет вам решить эти проблемы или вообще избежать их.
Исследование типов оболочек
Программа оболочки, которую запускает система при входе в систему, зависит от конфигурации вашего идентификатора пользователя. В файле /etc/passwd в поле № 7 записи для идентификатора пользователя указана программа оболочки по умолчанию. Эта программа оболочки по умолчанию запускается, когда пользователь либо входит в терминал виртуальной консоли, либо запускает эмулятор терминала в графическом интерфейсе пользователя.
В следующем примере пользователь Christine использует оболочку GNU Bash в качестве программы оболочки по умолчанию:
Программа оболочки Bash (bash) обычно находится в каталоге /usr/bin в современных системах Linux. Однако в вашей системе Linux вы можете найти его в каталоге /bin. Здесь может помочь команда which bash, указав каталог и имя файла для использования в оболочке Bash:
Длинный список показывает, что файл bash (оболочка Bash) является исполняемой программой, через звездочку (*) в конце имени файла:
Обычно в современных системах Linux каталог /bin связан символической ссылкой с каталогом /usr/bin/, поэтому пользователь Christine указала /bin/bash в качестве своей программы оболочки по умолчанию, но программа оболочки Bash фактически находится в каталоге /usr/bin/.
В этой конкретной системе Linux есть несколько других программ оболочки. Они включают tcsh, основанный на исходной оболочке C:
Другой оболочкой в этой системе является zsh, которая представляет собой более сложную версию оболочки Bash. Он также имеет несколько функций tcsh, а также другие элементы:
Программная ссылка оболочки C указывает на оболочку tcsh:
В системах Linux на основе Debian, таких как Ubuntu, часто можно встретить тире, которая является версией оболочки Ash:
В большинстве систем Linux можно найти различные установленные оболочки, которые можно использовать в качестве оболочки пользователя по умолчанию в файле /etc/shells, как показано здесь:
Во многих дистрибутивах Linux создается впечатление, что файл оболочки существует в двух местах — /bin и /usr/bin. Это связано с тем, что в современных системах Linux эти два каталога часто связаны символической ссылкой друг с другом, при этом /bin указывает на /usr/bin. Можно использовать любой каталог для доступа к оболочке. Символические ссылки, также называемые программными ссылками.
Пользователь может установить любую из этих различных программ оболочки в этой системе в качестве своей оболочки. Однако из-за его популярности редко используется какая-либо другая оболочка вместо Bash в качестве интерактивной оболочки по умолчанию для учетной записи. Интерактивная оболочка по умолчанию, также называемая оболочкой входа, запускается всякий раз, когда пользователь входит в терминал виртуальной консоли или запускает эмулятор терминала в графическом интерфейсе пользователя.
Другая оболочка, sh, является системной оболочкой по умолчанию. Системная оболочка по умолчанию используется для сценариев системной оболочки, например, необходимых при запуске.
Часто вы видите дистрибутив с его системной оболочкой по умолчанию (sh), указывающей на оболочку Bash с помощью программной ссылки. Пример этого показан здесь в дистрибутиве CentOS:
Однако имейте в виду, что в некоторых дистрибутивах системная оболочка по умолчанию связана иначе, например, в этом дистрибутиве Ubuntu:
В этом случае системная оболочка по умолчанию /usr/bin/sh указывает на оболочку Dash, а не на оболочку Bash.
Вы не обязаны придерживаться интерактивной оболочки по умолчанию. Вы можете запустить любую оболочку, доступную в вашем дистрибутиве, просто набрав ее имя. Однако не отображается никаких фанфар или сообщений, указывающих, какую оболочку вы используете в данный момент. Но помощь доступна из переменной $0. Команда echo $0 отобразит имя вашей текущей оболочки, предоставив необходимую ссылку.
Команда echo $0 показывает текущую используемую оболочку только тогда, когда она запускается в приглашении оболочки. Если используется в сценарии оболочки, вместо этого будет отображаться имя сценария.
С нашей удобной переменной $0 мы отобразим оболочку, которую мы используем в настоящее время, запустим оболочку Dash, набрав команду тире, и снова покажем имя новой оболочки через echo $0:
В предыдущем примере обратите внимание на тире (-) перед ответом bash на первую команду echo $0. Это указывает на то, что эта оболочка является оболочкой входа пользователя.
Приглашение $ — это приглашение CLI для оболочки Dash. Вы можете выйти из программы оболочки Dash (и оболочки Bash, если на то пошло), набрав команду exit:
Прыжки вперед и назад через различные оболочки кажутся простыми, но это еще не все, что происходит за кулисами. Чтобы понять этот процесс, в следующем разделе исследуется взаимосвязь между программой оболочки входа в систему и вновь запущенной программой оболочки.
Изучение отношений родительской и дочерней оболочки
Интерактивная оболочка по умолчанию (оболочка входа), которая запускается, когда пользователь входит в терминал виртуальной консоли или запускает эмулятор терминала в графическом интерфейсе пользователя, является родительской оболочкой. Как вы уже читали в этой книге, родительский процесс оболочки предоставляет подсказку CLI и ожидает ввода команд.
Когда в командной строке CLI вводится команда bash (или другое имя программы оболочки), создается новая программа оболочки. Это дочерняя оболочка. Дочерняя оболочка также имеет приглашение CLI и ожидает ввода команд.
Поскольку вы не видите никаких соответствующих сообщений, когда набираете bash и порождаете дочернюю оболочку, другая команда может помочь внести ясность. Полезно использовать это с параметром -f до и после входа в дочернюю оболочку:
Первое использование ps -f показывает два процесса. Один процесс имеет идентификатор 6160 (второй столбец) и выполняет программу оболочки Bash (последний столбец). Второй процесс (идентификатор процесса 7141) — это фактическая запущенная команда ps -f.
В предыдущем примере после ввода команды bash создается дочерняя оболочка. Второй ps -f выполняется из дочерней оболочки. На этом экране вы можете увидеть, что запущены две программы оболочки Bash. Первая программа оболочки Bash, родительский процесс оболочки, имеет исходный идентификатор процесса (PID) 6160. Вторая программа оболочки Bash, процесс дочерней оболочки, имеет PID 7142. Обратите внимание, что дочерняя оболочка имеет идентификатор родительского процесса ( PPID) 6160, что означает, что родительский процесс оболочки является его родительским. На рисунке внизу показана эта взаимосвязь:
Когда порождается дочерний процесс оболочки, только часть родительской среды копируется в среду дочерней оболочки. Это может вызвать проблемы с такими элементами, как переменные.
Дочерняя оболочка также называется подоболочкой. Подоболочка может быть создана из родительской оболочки, а подоболочка может быть создана из другой подоболочки:
В предыдущем примере команда bash была введена три раза. Фактически, это создало три подоболочки. Команда ps —forest показывает вложение этих подоболочек.
Команда ps -f может быть полезна при вложении подоболочки, потому что она показывает, чей родитель является через столбец PPID:
Программа оболочки Bash может использовать параметры командной строки для изменения запуска оболочки. В таблице внизу перечислены некоторые из этих доступных переключателей для использования с командой bash.
Опции | Описание |
-c string | Читает команды из строки и обрабатывает их |
-i | Запускает интерактивную оболочку, позволяющую вводить данные от пользователя. |
-l | Действует так, как будто вызывается как оболочка входа в систему |
-r | Запускает ограниченную оболочку, ограничивая пользователя каталогом по умолчанию |
-s | Читает команды со стандартного ввода |
Вы можете найти дополнительную справку по команде bash и даже больше параметров командной строки, набрав man bash. Команда bash —help также предоставляет дополнительную помощь.
Если вы хотите увидеть версию оболочки Bash, просто введите в командной строке bash —version. Это не создаст подоболочку, а вместо этого отобразит текущую версию программы оболочки GNU Bash вашей системы.
Вы можете корректно выйти из каждой подоболочки, введя команду выхода:
Команда exit не только позволяет вам покинуть дочерние подоболочки, но и выйти из текущего терминала виртуальной консоли или программного обеспечения эмуляции терминала. Просто введите exit в родительской оболочке и вы аккуратно выйдите из интерфейса командной строки.