HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Команда cd без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?</p>
1 <p>Команда cd без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?</p>
2 <p>Можно предположить, что команда cd каким-то образом обращается к операционной системе и узнает у нее эту информацию или смотрит напрямую в конфигурационных файлах. Но ни первого, ни второго она не делает.</p>
2 <p>Можно предположить, что команда cd каким-то образом обращается к операционной системе и узнает у нее эту информацию или смотрит напрямую в конфигурационных файлах. Но ни первого, ни второго она не делает.</p>
3 <p>Эта команда ориентируется на так называемую<strong>переменную окружения</strong>, которую мы изучим в этом уроке.</p>
3 <p>Эта команда ориентируется на так называемую<strong>переменную окружения</strong>, которую мы изучим в этом уроке.</p>
4 <h2>Что такое переменные окружения</h2>
4 <h2>Что такое переменные окружения</h2>
5 <p>Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командной оболочки, то есть, переменные пропадут, когда терминал закроется. Они подгружаются туда во время его инициализации, хотя это не единственный путь их появления.</p>
5 <p>Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командной оболочки, то есть, переменные пропадут, когда терминал закроется. Они подгружаются туда во время его инициализации, хотя это не единственный путь их появления.</p>
6 <p>Посмотреть установленные переменные можно командой env (<em>environment</em>). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:</p>
6 <p>Посмотреть установленные переменные можно командой env (<em>environment</em>). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:</p>
7 <p>Формат вывода очень простой: слева от знака равно расположено имя переменной, справа - значение. В вашем случае вывод команды env будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION, но наверняка будет HOME, только с другим значением.</p>
7 <p>Формат вывода очень простой: слева от знака равно расположено имя переменной, справа - значение. В вашем случае вывод команды env будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION, но наверняка будет HOME, только с другим значением.</p>
8 <p>Основное предназначение переменных окружения - конфигурирование системы и программ. Их удобство заключается в универсальности. Кроме того, они помогают отвязать нас от способа появления этих значений в системе.</p>
8 <p>Основное предназначение переменных окружения - конфигурирование системы и программ. Их удобство заключается в универсальности. Кроме того, они помогают отвязать нас от способа появления этих значений в системе.</p>
9 <p>Возьмем для примера ту же команду cd. Она знает лишь то, что домашняя директория доступна в переменной окружения HOME. Как она попала в систему - не важно.</p>
9 <p>Возьмем для примера ту же команду cd. Она знает лишь то, что домашняя директория доступна в переменной окружения HOME. Как она попала в систему - не важно.</p>
10 <p>Без переменной окружения пришлось бы делать одну из двух вещей:</p>
10 <p>Без переменной окружения пришлось бы делать одну из двух вещей:</p>
11 <ul><li>При вызове cd каждый раз указывать, где находится домашняя директория. Например, так: cd --home-dir /home/kirill.m. Такой способ убивает весь смысл быстрого перехода в домашнюю директорию</li>
11 <ul><li>При вызове cd каждый раз указывать, где находится домашняя директория. Например, так: cd --home-dir /home/kirill.m. Такой способ убивает весь смысл быстрого перехода в домашнюю директорию</li>
12 <li>Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой cd при каждом запуске</li>
12 <li>Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой cd при каждом запуске</li>
13 </ul><p>Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем - это HOME:</p>
13 </ul><p>Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем - это HOME:</p>
14 <p>Теперь проведем эксперимент: попробуем установить HOME и выполнить переход в эту директорию с помощью команды cd, которая должна отправить нас в домашнюю директорию:</p>
14 <p>Теперь проведем эксперимент: попробуем установить HOME и выполнить переход в эту директорию с помощью команды cd, которая должна отправить нас в домашнюю директорию:</p>
15 <p>Команда cd выполнила переход по пути, указанном в переменной HOME. Теперь снова сделаем cd, но не добавляя определение переменной слева:</p>
15 <p>Команда cd выполнила переход по пути, указанном в переменной HOME. Теперь снова сделаем cd, но не добавляя определение переменной слева:</p>
16 <p>В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения:<strong>локальный</strong>и<strong>глобальный</strong>.</p>
16 <p>В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения:<strong>локальный</strong>и<strong>глобальный</strong>.</p>
17 <p>Когда мы указали HOME=/tmp прямо перед командой cd, то переменная не была изменена для текущей сессии - она была изменена для запущенной команды, в данном случае cd. Такой трюк можно проделывать с любой командой.</p>
17 <p>Когда мы указали HOME=/tmp прямо перед командой cd, то переменная не была изменена для текущей сессии - она была изменена для запущенной команды, в данном случае cd. Такой трюк можно проделывать с любой командой.</p>
18 <p>Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:</p>
18 <p>Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:</p>
19 <p>Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.</p>
19 <p>Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.</p>
20 <p>Особую роль среди переменных окружения играет PATH - еще одна важная переменная. Сложности с ней возникают настолько часто, что этой переменной посвящен практически целый урок впереди.</p>
20 <p>Особую роль среди переменных окружения играет PATH - еще одна важная переменная. Сложности с ней возникают настолько часто, что этой переменной посвящен практически целый урок впереди.</p>