Заметки про shell aka оболочка, environment aka окружение и его настройка, а также запуск дочерних процессов.
Login Shell
Оболочка(shell) — это обычная программа. Которая в цикле выполняет примерно такие действия:
- Вывести приглашение командной строки.
- Прочитать команду из стандартного ввода.
- Интерпретировать и запустить команду.
$ 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-группе!