Заметки про shell aka оболочка, environment aka окружение и его настройка, а также запуск дочерних процессов.

Login Shell

Оболочка(shell) — это обычная программа. Которая в цикле выполняет примерно такие действия:

  1. Вывести приглашение командной строки.
  2. Прочитать команду из стандартного ввода.
  3. Интерпретировать и запустить команду.
$ where bash

/bin/bash

При входите в систему, Linux автоматически запускает экземпляр оболочки, известный как командная оболочка входа в систему (login shell).

Допустимые оболочки обычно перечислены в файле /etc/shells.

Родительский и дочерний процессы

У каждого процесса есть свое окружение(environment).

Каждый раз, когда вы запускаете команду, shell создает дочерний процесс и копию своего окружения. После этого изменения в окружениях не влияют друг на друга.

cd — это не программа, а встроенная функция оболочки (shell builtin). По этому он может менять PWD.

Но есть запустить cd в скрипте, то будет создат новый процесс с копией окружения и все изменения будут в нем.

#!/bin/bash

cd /etc
pwd

После запуска скрипта текущий каталог не изменится.

Переменные окружения

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

Например:

HOME — путь к вашему домашнему каталогу.

PWD — текущий каталог вашей оболочки.

EDITOR — имя или путь предпочитаемого вами текстового редактора.

Просмотрите переменные окружения можно с помощью команды printenv или env.

Локальные переменные не отображаются в выводе printenv.

Создание переменных окружения

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

$ MY_VARIABLE=10.     # Присвоим значение локальной переменной
$ export MY_VARIABLE  # Экспортируем, чтобы она стала переменной окружения
$ export ANOTHER_VARIABLE=20 # Все вместе в одной команде

export означает, что переменная и ее значение будут скопированы из текущей оболочки во всех ее будущих потомков. Локальные переменные не копируются.

Значения локальных переменных, которые не копируются в дочерние элементы, могут быть установлены в файле конфигурации Linux, например $HOME/.bashrc. Каждый экземпляр оболочки при вызове считывает и выполняет соответствующие файлы конфигурации.

Подоболочки (Subshells)

Подоболочка, является полной копией своего родителя. Она включает в себя все родительские переменные, псевдонимы, функции и многое другое. Чтобы запустить команду в подоболочке, заключите ее в круглые скобки:

$ (ls -l) # Запускает ls -l в подоболочке

Чтобы проверить, является ли экземпляр оболочки подоболочкой, выведите переменную BASH_SUBSHELL.

Настройка окружения

Когда команда bash запускается, она настраивает себя, читая и выполняя последовательность файлов конфигурации. Эти файлы определяют переменные, псевдонимы, функции, другие свойства оболочки и могут запускать любую команду Linux.

Cтандартные файлы конфигурации bash

  • Файлы запуска
    Файлы конфигурации, которые выполняются автоматически при входе в систему, то есть они применяются только к вашей оболочке входа в систему. Однако определение псевдонима в этом файле малополезно, поскольку псевдонимы не копируются в дочерние элементы.
  • Файлы инициализации
    Файлы конфигурации, которые выполняются для каждого экземпляра оболочки, за исключением оболочки входа в систему, например когда вы вручную запускаете интерактивную оболочку или сценарий неинтерактивной оболочки. Команды файла инициализации могут установить переменную или определить псевдоним.
  • Файлы очистки при выходе
    Файлы конфигурации, которые выполняются непосредственно перед выходом из оболочки входа в систему.
Тип файла Чем запускается Общесистемное местоположение Расположение личных файлов (в порядке вызова)
Файлы запуска Оболочка входа в систему (при вызове) /etc/profile $HOME/.bash_profile $HOME/.bash_login $HOME/.profile
Файлы инициализации Интерактивная оболочка. Сценарии оболочки /etc/bash.bashrc $HOME/.bashrc
Файлы очистки Оболочка входа в систему (при выходе) /etc/bash.bash_logout $HOME/.bash_logout

Повторное считывание файла конфигурации

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

$ source ~/.bash_profile # Используется встроенная команда source
$ . ~/.bash_profile # Используется точка

Почему вы считываете файл конфигурации, вместо того чтобы сделать его исполняемым с помощью chmod и запустить как сценарий? Потому что сценарий запускается в дочернем процессе. Команды в сценарии не повлияют на вашу родительскую оболочку, а после завершения дочернего процесса все изменения будут потеряны.


Комментарии в Telegram-группе!