Напомним, что команда 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. Как она попала в систему — не важно. Без переменной окружения пришлось бы делать одну из двух вещей:

Существует некоторый базовый набор переменных, которые всегда устанавливаются башем при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это 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. Она важна для разработчиков и часто возникают связанные с ней сложности, по этому с ней стоит познакомиться поближе.

Статьи