Напомним, что команда cd без аргументов делает домашнюю директорию пользователя рабочей (working directory). Возникает вопрос, каким образом она узнаёт о том, где находится домашняя директория? Но ответ гениально прост - эта команда ориентируется на так называемую переменную окружения. Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командного интерпретатора, подгружаются туда во время его инициализации (но это не единственный путь их появления). Посмотреть установленные переменные можно командой env (environment).
Вот к примеру неполный вывод пременных на моём компьютере:
$ env
SHELL=/bin/bash
DESKTOP_SESSION=Lubuntu
LXQT_SESSION_CONFIG=session
PWD=/home/rekoshed/Github/Rekoshed.github.io/Bash/Overviev
LOGNAME=rekoshed
QT_QPA_PLATFORMTHEME=lxqt
XDG_SESSION_TYPE=x11
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
XAUTHORITY=/home/rekoshed/.Xauthority
HOME=/home/rekoshed
LC_PAPER=en_AG
LANG=ru_RU.UTF-8
XDG_CURRENT_DESKTOP=LXQt
LXQT_DEFAULT_OPENBOX_CONFIG=/etc/xdg/xdg-Lubuntu/openbox/lxqt-rc.xml
USER=rekoshed
BROWSER=/usr/bin/yandex-browser-beta
PATH=/home/rekoshed/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/rekoshed/.composer/vendor/bin:/home/rekoshed/.composer/vendor/bin
TERM_PROGRAM=vscode
_=/usr/bin/env
Формат вывода очень простой: слева от знака равно имя переменной, справа — значение. Вывод команды env в вашем случае будет отличаться не только значениями этих переменных, но и их составом.
Основное предназначение переменных окружения — конфигурация системы и программ. Их удобство заключается в универсальности и отвязке от способа появления этих значений в системе. Возьмём ту же cd. Эта команда знает лишь то, что домашняя директория доступна в переменной окружения HOME. Как она попала в систему — не важно. Без переменной окружения пришлось бы делать одну из двух вещей:
- При вызове
cdкаждый раз указывать, где находится домашняя директория. Например, так:cd --home-dir /home/rekoshed. Но такой способ убивает весь смысл быстрого перехода в домашнюю директорию. - Договариваться о том, что где-то будет храниться специальный файл с настройками (в том числе домашней директории), которые будут читаться командой
cdпри каждом запуске.
Существует некоторый базовый набор переменных, которые всегда устанавливаются башем при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME.
По умолчанию любой запущенный процесс получает все переменные родительского процесса (процесс-создатель). Именно поэтому команда cd может прочитать переменную HOME. Переменные можно создавать и изменять в любой момент времени, например:
# Для вывода переменной используется echo, а перед самой переменной ставится знак $. $ echo $HOME /home/rekoshed # Для установки знак $ не нужен. # Очень важно чтобы не было пробелов вокруг знака равно $ HOME=/tmp
Теперь проведём эксперимент: попробуем установить HOME и выполнить переход.
# Достаточно выполнить присваивание слева от запускаемой команды $ HOME=/tmp cd /tmp$ pwd /tmp
Ничего не подозревающая команда cd получила переменную HOME и выполнила честный переход в указанную директорию. Теперь снова сделаем cd, но уже не указывая ничего.
$ cd ~$ pwd /home/rekoshed ~$ echo $HOME /home/rekoshed
В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов выше изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный. Когда мы указали HOME=/tmp прямо перед командой cd, то переменная не была изменена локально — т.е. была изменена для запущенной команды, в данном случае cd. Такой трюк можно проделывать с любой командой. Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:
~$ export HOME=/tmp /home/rekoshed$ cd ~$ pwd /tmp ~$ echo $HOME /tmp
Обратите внимание на то, что изменение происходит в рамках текущей сессии, другими словами, если у вас открыто две вкладки терминала, и в каждой загружен баш, то изменение произойдет только в той вкладке, в которой будет выполнена команда.
Особую роль среди переменных окружения играет переменная PATH. Она важна для разработчиков и часто возникают связанные с ней сложности, по этому с ней стоит познакомиться поближе.