- Переменные оболочки и окружения в Linux
- Общая информация по окружению и переменным
- Выведем переменную оболочки и окружения
- Типовые переменные окружения и оболочки
- Настроим переменные оболочки и окружения
- Создадим переменную оболочки
- Создадим переменную окружения
- Понижение и сброс переменных
- Настроим переменные окружения при входе
- Сеансы оболочки с входом и без него, интерактивные и не интерактивные
- Реализуем переменные окружения
- Заключение
- Как лучше создать глобальную переменную окружения в linux?
Переменные оболочки и окружения в Linux
Взаимодействие с удаленным сервером сопровождается большим объемом информации, по которой система определяет свое «поведение», например, какой уровень доступа предоставлять к ресурсам. Часть таких настроек сохранена в конфигурации хоста, остальные определяет пользователь за счет кода прикладных приложений.
Популярный вариант контроля настроек и данных предполагает использование окружения. Это участок памяти (область), используемый для хранения данных, определяющих характеристики операционной системы Linux.
В этом материале мы рассмотрим принцип настройки переменных окружения, как при помощи конфигурационных файлов, так и в интерактивном режиме. В качестве тестовой платформы можно использовать облачный сервер от Timeweb Cloud.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Общая информация по окружению и переменным
При каждом запуске сеанса активируется сбор информации, доступной самой оболочке, процессам, действующим внутри нее. Считывание данных система осуществляет из собственных настроек и из других файлов, имеющих отношение к загрузке. Окружение здесь представляет среду, откуда оболочка во время работы получает необходимые вводные.
Информация в нем представлена как пара ключ-значение. Если запланирована передача нескольких значений, их разделяют, например, двоеточием (зависит от программы, которая будет интерпретировать их). Выглядит это так:
Если в значении имеются пробелы, его закрывают кавычками:
Ключи могут иметь отношение к переменным окружения Linux или оболочки. Первая категория используется внутри текущей сессии и передается дочерним процессам (оболочкам). Содержимое второго типа имеют отношение только к одной оболочке, где их определили.
Выведем переменную оболочки и окружения
Просмотреть перечень локальных переменных можно по-разному. Например, с использованием printenv или env. Обе команды работают схожим образом:
Результат исполнения команды будет выведен на экран:
SHELL=/bin/bash
TERM=xterm
USER=demouser
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca.
MAIL=/var/mail/demouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/demouser
LANG=en_US.UTF-8
SHLVL=1
HOME=/home/demouser
LOGNAME=demouser
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv
Отличие между командами проявится при внесении индивидуальных опций. Так, для первой из перечисленных можно указать конкретную переменную и просмотреть ее значение:
Теперь вывод примет иной вид:
В функционал команды env входит возможность изменения окружения, где запущены приложения, за счет передачи конкретных определений:
env VAR1="value" command_to_run command_options
Настройки переменных оболочки передаются всем дочерним процессам. При просмотре еще применяют команду set. В случае ввода без опций она выводит на экран перечень переменных и функций.
Результат исполнения представлен следующим образом:
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
…
Список будет большим, поэтому команду чаще используют с опцией, позволяющей сделать вывод короче:
Если информации все равно слишком много, можно дополнительно сократить перечень за счет режима POSIX. Он позволяет исключить отображение функций.
Теперь команда отображает переменные. Для примера сравним выводимые данные командами set и env:
Перечисленные возможности показывают, какие переменные имеются в активном сеансе, который воспринимает их как «постоянные значения» и применяет для всех запускаемых процессов без потребности каждый раз менять конфигурационные файлы.
Типовые переменные окружения и оболочки
Рассмотрим наиболее востребованные переменные окружения и дадим краткое описание:
- SHELL – описание оболочки, где интерпретируются вводимые команды – обычно это bash, но пользователь вправе указать иной способ;
- TERM – указание вида терминала, используемого при старте;
- USER – наименование аккаунта, который использовался для входа в систему;
- PWD – рабочая папка;
- OLDPWD – папка, используемая ранее (необходима для возможности вернуться в нее при помощи cd-);
- LS_COLORS – коды, выделяющие различными цветами файлы в соответствии с их типом (для удобства восприятия больших объемов информации при беглом осмотре);
- MAIL – путь, где размещен почтовый ящик активного аккаунта;
- PATH – перечень папок, где система ищет команды;
- LANG – поддерживаемый язык;
- HOME – домашняя папка пользователя;
- _ – команда, которую выполнила система последней.
Теперь рассмотрим популярные переменные оболочки:
- BASHOPTS – опции, которые использовались при обращении к bash;
- BASH_VERSION – текущая версия bash в понятном для чтения виде;
- BASH_VERSINFO – то же, но в виде машинного кода;
- COLUMNS – количество столбцов, которые надо отображать при выводе;
- DIRSTACK – стек директорий, доступных командам pushd и popd;
- HISTFILESIZE – количество строк, сохраняемых в журнале исполненных команд;
- HISTSIZE – то же, но относится к лимиту хранения уже в памяти;
- HOSTNAME – действующее имя сервера;
- IFS – разделитель поля, без указания применяется пробел;
- PS1 – вид приглашения при старте текущего сеанса;
- PS2 – то же, но для случаев использования нескольких строк;
- SHELLOPTS – опции, задаваемые командой set;
- UID – ID активного аккаунта.
Настроим переменные оболочки и окружения
Перейдем к изучению различий переменных оболочки и окружения. Заодно познакомимся с синтаксисом их настройки.
Создадим переменную оболочки
Начнем с текущего сеанса. Все, что нам нужно сделать – внести имя и значение. Мы применим правила, предполагающие ввод заглавными буквами. Пример:
Команда задает пустую строку. Раз в значении есть пробел, мы его заключили в кавычки. И так как в конце стоит восклицательный знак (спецсимвол bash), использован их одинарный вид. Текущая только что заданная переменная доступна только в активном сеансе, передать дочерним процессам ее не получится.
Чтобы подтвердить это, попробуем найти новую переменную:
Повторим действие командой printenv:
Теперь на экране ничего нет. Значит, мы имеем дело не с переменной окружения. Перейдем к демонстрации метода открытия доступа к значению переменной.
В этом случае вывод будет таким:
Вывод простой – чтобы обратиться к значению переменной, достаточно добавить знак $. Откроем новый bash, чтобы проверить, передается ли информация «дочкам».
Значение не возвращается, это ожидаемо. Теперь вернемся к изначальной оболочке:
Создадим переменную окружения
На следующем этапе изучения преобразуем переменную из оболочки в окружение. Выполняется такая операция экспортом. Это выглядит так:
Чтобы подтвердить преобразование, введем:
Отлично, переменная отображается. Проверим, произойдет ли то же в дочерней оболочке:
Все функционирует, как и предполагалось. Можно экспортировать переменную прямо из дочерней bash всего за один шаг:
export NEW_VAR="Testing export"
Проверим результат экспорта:
Теперь можно возвращаться в исходную оболочку:
Выясним, есть ли доступ к новой переменная оттуда:
Возврата нет. Итог предсказуем, ведь переменные окружения передаются в сторону дочерних процессов, но не наоборот. Благодаря этому свойству приложения не влияют на работоспособность окружения.
Понижение и сброс переменных
Сразу уточним, что ранее созданная TEST_VAR все еще активна в качестве переменной окружения. В этом примере мы преобразуем ее обратно в переменную оболочки:
printenv | grep TEST_VAR
set | grep TEST_VAR
Можно целиком сбросить значения переменных:
После применения команды в ответ ничего не вернется:
Настроим переменные окружения при входе
Напоследок рассмотрим возможности автоматического определения переменных, чтобы избежать их ручной настройки.
Сеансы оболочки с входом и без него, интерактивные и не интерактивные
Оболочка bash считывает конфигурационные файлы исходя из способа запуска сеанса. Например, используют вариант с входом или без него. Первый способ старта предполагает аутентификацию пользователя перед активацией того же SSH-канала. Второй – это запуск внутри оболочки, куда уже вошли, например, запуск скрипта из командной строки.
Можно разделить сеансы оболочки на интерактивные и не интерактивные. Первый вариант – всегда прикреплен к терминалу. Второй, наоборот, не прикреплен к нему. Вернемся к разделению «вход – не вход». Варианты отличает еще и различный набор считываемых файлов. Так, при осуществлении входа система обращается сначала к файлу /etc/profile.
Затем будет осуществлен поиск конфигурационного файла в домашней директории пользователя, откуда оболочка считает его индивидуальные настройки. В списке – ~/.bash_profile, ~/.bash_login и ~/.profile/. Если речь идет об оболочке без входа, система обратится к файлу /etc/bash.bashrc, а следом к ~/.bashrc (важно учитывать, что /etc/bash.bashrc используется только в Debian и дистрибутивах, созданных на его основе). Подробнее читайте в официальной документации по Bash .
Реализуем переменные окружения
На практике перед применением настроек, считанных из файлов, желательно сначала просмотреть их содержимое. Обычно предстоит настраивать переменные окружения под пользователя. В качестве примера используем файл ~/.bashrc. Откроем его:
По умолчанию в нем уже содержится приличный объем информации. Большая ее часть относится к опциям bash, а не к переменным окружения. Зададим последние строкой:
Внутри файла ~/.bashrc можно разместить любые новые переменные окружения. Главное, после изменений согласиться с их сохранением. Теперь при каждом старте сеанса оболочки переменные будет объявляться автоматически (подробнее в мануале). Сейчас же мы считаем файл вручную:
Заключение
Переменные окружения и оболочки – постоянная составляющая любого сеанса оболочки, поэтому есть смысл изучить их применение для повышения эффективности работы с приложениями. Это штатный вариант конфигурирования родительских процессов, инструмент задания опций без файлов. Переменная может быть объявлены на уровне оболочки в целом или на уровне какого-то отдельного приложения.
Такой подход имеет преимущества, например, за счет отсутствия необходимости сохранять данные аутентификации в файлах, доступных для просмотра посторонним. Подобных сценариев множество, и каждый из них настраивается схожим способом. При экспериментах лучше использовать сервер, на котором пока нет ничего ценного. Например, арендовать новый у Timeweb Cloud .
Как лучше создать глобальную переменную окружения в linux?
И переменных суперпользователя обычные пользователи и не должны видеть, они касаются только его окружения.
В Linux нет понятия «глобальная переменная окружения». Дочерние процессы наследуют окружение родительского.
Вариант с /etc/environment ближе всего к тому, что можно было бы назвать «глобальной переменной окружения» — эти переменные устанавливаются при логине.
Для конкретного пользователя — можно использовать ~/.profile (выполняется код оттуда выполняется login shell).
Пожалуйста, уточните задачу, ибо создание глобальных переменных окружения (т. е. видимых всеми процессами и пользователями) да еще и из установочного скрипта необычное решение, и возможно изначальную задачу правильнее решать другими методами.
нужно создать переменные, которые будут хранить время восхода и заката. в дальнейшем переменные планируется использовать в создании правила для cron. система debian/maemo
Я правильно понимаю, что задача — запускать некие скрипты в моменты заката и восхода?
Хранить данные лучше не в переменных окружения, а в файлах.
Например такое решение: создать каталоги /etc/cron.sunset и /etc/cron.sunrise. Далее тот код, который вычисляет (или где-то берет) время заката/восхода запускается ежесуточно из cron’а, создает файл /etc/cron.d/sun, в котором будет указано запускать все скрипты из этих каталогов в соответствующее время. После чего этот же код выполняет /etc/rc.d/init.d/crond reload.
Если вы таки опишете что именно и как вы собираетесь таким образом запускать, может быть я смогу подсказать еще лучшее решение.
Вы все правильно поняли: действительно требуется запускать скрипты, программы по времени восхода/заката [запустить calendar, вывести сообщение, сменить профиль на смартфоне]