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

LinuxBeginner
Практиковаться сейчас

Введение

Добро пожаловать на практическое занятие по переменным окружения в Linux! Переменные окружения — это динамические значения, которые могут влиять на поведение запущенных процессов в компьютере. Они играют ключевую роль в настройке системы и выполнении программ. Освоив работу с ними, вы получите важные навыки для системного администрирования Linux и разработки программного обеспечения.

В ходе этого практикума вы научитесь создавать, просматривать, изменять и удалять переменные окружения. Мы также разберем, как сделать эти изменения постоянными, и изучим некоторые наиболее важные встроенные переменные окружения Linux. Независимо от того, являетесь ли вы новичком или хотите закрепить свои знания, этот лабораторный модуль предоставит вам ценный практический опыт.

Приступим!

Понимание переменных в Linux

Прежде чем мы перейдем к переменным окружения, начнем с базовых переменных оболочки (shell variables). Это поможет вам понять саму концепцию переменных в Linux.

  1. Откройте терминал. Вы должны находиться в директории /home/labex/project. Если нет, перейдите в нее с помощью следующей команды:

    cd /home/labex/project
    
  2. Теперь создадим простую переменную оболочки. В Linux переменную можно создать, просто присвоив значение имени. Создадим переменную с именем my_var:

    my_var="Hello, Linux"
    

    Важное примечание: При присваивании значений переменным в Bash (и Zsh, которую мы используем в этом практикуме) вокруг знака равенства (=) не должно быть пробелов. Записи вида my_var = "Hello, Linux" или my_var= "Hello, Linux" приведут к ошибке.

  3. Чтобы просмотреть значение переменной, используйте команду echo с символом $ перед именем переменной. Символ $ указывает оболочке подставить значение переменной:

    echo $my_var
    

    Вы должны увидеть вывод:

    Hello, Linux
    
  4. Вы также можете использовать переменные внутри других команд или присваиваний. Например:

    echo "The value of my_var is: $my_var"
    

    Это выведет: The value of my_var is: Hello, Linux

Отличная работа! Вы только что создали и использовали свою первую переменную оболочки. Однако эта переменная доступна только в текущей сессии терминала. Если вы откроете новое окно или вкладку терминала, эта переменная там будет недоступна. Именно здесь на помощь приходят переменные окружения.

Введение в переменные окружения

Теперь, когда мы понимаем основы, изучим переменные окружения. Переменные окружения — это переменные, доступные любому дочернему процессу оболочки. Это означает, что к ним могут обращаться скрипты и программы, запущенные из этой оболочки.

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

    env
    

    Появится длинный список. Не беспокойтесь, если пока не понимаете их все — позже мы разберем самые важные.

  2. Одной из наиболее значимых переменных окружения является PATH. Давайте взглянем на нее:

    echo $PATH
    

    Переменная PATH содержит список директорий, в которых система ищет исполняемые файлы программ. Директории разделяются двоеточием (:).

  3. Теперь создадим собственную переменную окружения. Для этого используется команда export:

    export MY_ENV_VAR="This is an environment variable"
    

    Команда export делает переменную доступной для дочерних процессов. В этом и заключается ключевое различие между обычными переменными оболочки и переменными окружения.

  4. Чтобы проиллюстрировать разницу, создадим скрипт, который пытается получить доступ и к обычной переменной оболочки, и к переменной окружения. Мы сделаем это с помощью конструкции heredoc и команды cat — это стандартный способ записи многострочного текста в файл:

    cat << 'EOF' > test_vars.sh
    #!/bin/bash
    echo "Shell variable: $my_var"
    echo "Environment variable: $MY_ENV_VAR"
    EOF
    

    Сделайте скрипт исполняемым:

    chmod +x test_vars.sh
    

    Теперь запустите его:

    ./test_vars.sh
    

    Вы увидите, что переменная окружения (MY_ENV_VAR) доступна, а переменная оболочки (my_var) — нет. Это произошло потому, что my_var не была экспортирована, и дочерние процессы (такие как наш скрипт) о ней не знают.

  5. Чтобы убедиться, что MY_ENV_VAR теперь является переменной окружения, можно снова использовать env, но отфильтровать вывод с помощью grep:

    env | grep MY_ENV_VAR
    

    Вы должны увидеть вашу новую переменную в выводе.

  6. Вы также можете напрямую проверить значение вашей новой переменной окружения:

    echo $MY_ENV_VAR
    

Превосходно! Вы создали свою первую переменную окружения и увидели, чем она отличается от переменной оболочки. Главное отличие: переменные окружения, созданные с помощью export, наследуются дочерними процессами.

Переменные окружения и переменные оболочки имеют свою область видимости. Когда вы экспортируете переменную (например, export MY_ENV_VAR="something"), она становится доступной любому подпроцессу, запущенному из этой оболочки. Однако, если вы откроете совершенно отдельную сессию оболочки, она не унаследует переменные из текущей, если только вы не пропишете их в конфигурационном файле (например, .zshrc или .bashrc).

Иными словами:

  • Обычная переменная оболочки видна только внутри текущей сессии.
  • Экспортированная переменная доступна дочерним процессам, запущенным из этой сессии.
  • Переменная, установленная в конфигурационном файле (например, .zshrc), применяется ко всем новым сессиям этой оболочки.

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

На следующих этапах мы научимся делать переменные окружения постоянными.

Уровни постоянства переменных

Для визуализации различий между типами переменных и уровнями их постоянства приведена следующая схема:

graph LR
    A["Типы переменных Linux"] --> B["Переменная оболочки"]
    A --> C["Переменная окружения"]
    A --> D["Постоянная переменная"]

    B --> B1["Только текущая сессия"]
    B --> B2["Не наследуется"]
    B --> B3["Утеряется при выходе"]

    C --> C1["Область сессии"]
    C --> C2["Доступна детям"]
    C --> C3["Утеряется при выходе"]

    D --> D1["Все сессии"]
    D --> D2["Доступна детям"]
    D --> D3["Сохраняется"]

    B1 --> E1["my_var='value'"]
    C2 --> E2["export VAR='value'"]
    D3 --> E3["Файл ~/.zshrc"]

    style B fill:#ffebee
    style C fill:#fff3e0
    style D fill:#e8f5e8

В этой таблице приведена краткая справка:

Тип переменной Область видимости Доступ дочерним процессам Сохранность Пример синтаксиса
Переменная оболочки Только текущая сессия Нет Исчезает при выходе my_var='value'
Переменная окружения Текущая сессия Да Исчезает при выходе export VAR='value'
Постоянная переменная Все новые сессии Да Сохраняется после выхода В файле ~/.zshrc

Понимание этих трех уровней критически важно для эффективного администрирования Linux.

Изменение переменной окружения PATH

Переменная PATH — одна из самых важных в Linux. Она указывает системе, где искать исполняемые файлы. Давайте изменим ее, добавив новую директорию.

  1. Сначала создадим новую директорию, где мы могли бы хранить свои скрипты:

    mkdir ~/my_scripts
    

    Это создаст папку my_scripts в вашем домашнем каталоге. Символ ~ — это сокращение пути к домашней директории (в данном случае /home/labex).

  2. Теперь добавим эту директорию в ваш PATH. Мы снова используем export, но на этот раз модифицируем существующую переменную:

    export PATH="$PATH:$HOME/my_scripts"
    

    Разберем команду:

    • $PATH — это текущее значение переменной PATH. Мы берем старое значение и дополняем его.
    • : используется как разделитель путей в PATH. Если его пропустить, оболочка не сможет корректно распознать пути.
    • $HOME — переменная окружения, указывающая на ваш домашний каталог.
    • Таким образом, мы добавляем :$HOME/my_scripts в конец существующего списка. Система будет искать программы в my_scripts после того, как проверит все стандартные директории.
  3. Проверьте, что новая директория добавлена:

    echo $PATH
    

    Вы должны увидеть /home/labex/my_scripts в конце вывода.

  4. Чтобы протестировать это, создадим простой скрипт в нашей новой директории:

    cat << 'EOF' > ~/my_scripts/hello.sh
    #!/bin/zsh
    echo "Hello from my custom script!"
    EOF
    

    Первая строка #!/bin/zsh (шебанг) сообщает системе, что это скрипт zsh и его нужно запускать соответствующим интерпретатором.

  5. Сделайте скрипт исполняемым:

    chmod +x ~/my_scripts/hello.sh
    

    Команда chmod +x дает права на выполнение. Без этого шага при попытке запуска вы получите ошибку "permission denied" (отказано в доступе).

  6. Теперь вы сможете запустить этот скрипт из любого места, просто введя его имя:

    hello.sh
    

    Если все сделано правильно, вы увидите: Hello from my custom script!

Это работает, потому что мы добавили my_scripts в PATH. Когда вы вводите команду, оболочка по порядку просматривает все директории из списка PATH в поисках файла с таким именем.

Для демонстрации попробуйте перейти в другую директорию и запустить скрипт снова:

cd /tmp
hello.sh

Скрипт все равно сработает. В этом и заключается мощь переменной PATH — она позволяет запускать программы из любой точки системы.

Как сделать переменные окружения постоянными

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

В этой среде используется Z shell (zsh). Это расширенная версия Bourne Shell (sh) с множеством улучшений. Zsh очень популярна и является оболочкой по умолчанию в macOS.

Если бы вы использовали Bash, вы бы редактировали .bashrc. Но так как у нас Zsh, мы будем изменять .zshrc. Очень важно использовать правильный файл. Если вы измените .bashrc, работая в zsh, переменные не подгрузятся.

  1. Откройте файл .zshrc в домашней директории с помощью текстового редактора. Мы используем nano — простой консольный редактор:

    nano ~/.zshrc
    

    Этот файл выполняется каждый раз при запуске новой сессии терминала.

  2. Прокрутите файл в самый низ (используйте стрелки на клавиатуре) и добавьте следующие строки:

    export MY_ENV_VAR="This is an environment variable"
    export PATH="$PATH:$HOME/my_scripts"
    

    Убедитесь, что синтаксис верен и вокруг знака = нет пробелов.

  3. Сохраните файл и выйдите. В nano это делается нажатием Ctrl+X, затем Y (для подтверждения сохранения) и Enter.

  4. Чтобы применить изменения немедленно, не перезапуская терминал, используйте команду source:

    source ~/.zshrc
    

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

Теперь эти переменные будут устанавливаться автоматически при каждом открытии терминала.

Изучение важных встроенных переменных окружения

В Linux есть несколько встроенных переменных, критически важных для работы системы:

  1. HOME: Указывает на домашнюю директорию текущего пользователя.

    echo $HOME
    
  2. USER: Содержит имя текущего пользователя.

    echo $USER
    
  3. SHELL: Определяет оболочку пользователя по умолчанию.

    echo $SHELL
    
  4. PWD: Сокращение от "Print Working Directory". Содержит путь к текущей рабочей директории.

    echo $PWD
    
  5. TERM: Определяет тип эмуляции терминала.

    echo $TERM
    

Знание этих переменных помогает лучше ориентироваться в среде Linux и управлять ею.

Удаление переменных окружения

Иногда возникает необходимость удалить переменную окружения. Это делается с помощью команды unset.

  1. Сначала проверим, установлена ли наша переменная MY_ENV_VAR:

    echo $MY_ENV_VAR
    
  2. Чтобы удалить переменную, используйте unset:

    unset MY_ENV_VAR
    
  3. Убедитесь, что переменная удалена:

    echo $MY_ENV_VAR
    

    Вывод должен быть пустым.

  4. Вы также можете использовать опцию -v, чтобы гарантированно удалять именно переменную, а не функцию оболочки с тем же именем:

    unset -v MY_ENV_VAR
    

Помните: если вы добавили переменную в файл .zshrc, она снова появится при следующем открытии терминала или при выполнении команды source .zshrc.

Резюме

Поздравляем! Вы завершили комплексный практикум по переменным окружения в Linux. Давайте повторим, что вы узнали:

  1. Вы научились создавать простые переменные оболочки и поняли их область видимости.
  2. Вы изучили переменные окружения и их отличие от обычных переменных, особенно в контексте наследования дочерними процессами через команду export.
  3. Вы изменили важную переменную PATH, добавив в нее свою директорию, что позволило запускать скрипты из любого места системы.
  4. Вы научились делать переменные постоянными, добавляя их в .zshrc, и узнали, как применять изменения с помощью команды source.
  5. Вы познакомились с основными встроенными переменными окружения Linux.
  6. Вы освоили удаление переменных с помощью команды unset.

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

Помните: практика — залог успеха. Попробуйте создавать свои переменные для различных задач и исследуйте, как другие программы используют их для управления своим поведением. Удачи в обучении!