Команда env

Команда env позволяет модифицировать список переменных окружения перед исполнением пользовательской команды. В некоторых командных оболочках она является встроенной, в некоторых — внешней командой.

Базовый синтаксис команды выглядит следующим образом:

$ env [параметры] [ИМЯ=ЗНАЧЕНИЕ] ... [команда]

При вызове env без каких-либо параметров будет выведен список всех переменных окружения. В качестве команды может использоваться произвольная команда с любыми аргументами или без аргументов, для корректного исполнения которой требуется изменение значений переменных окружения. Наиболее часто используемыми параметрами являются параметр -i, позволяющий игнорировать все системные переменные окружения и параметр -u, после которого должно идти имя переменной окружения, которую нужно игнорировать.

Наиболее часто используемыми переменными окружения являются переменные со следующими именами:

Имя переменной Значение переменной
USERNAME Имя текущего пользователя
HOME Путь к домашней директории текущего пользователя
SHELL Путь к бинарному файлу командной оболочки текущего пользователя
EDITOR Путь к бинарному файлу стандартного текстового редактора с интерфейсом командной строки
PATH Список директорий для поиска бинарных файлов
HOSTNAME Имя компьютера
LANG Имя выбранной локализации, начинающееся с LC_
PS1 Параметры приветствия командной оболочки
DISPLAY Имя дисплея оконной системы Xorg
TZ Обозначение системного часового пояса

Обозначение системного часового пояса

Рассматриваемая команда особенно полезна для написания переносимых сценариев командной оболочки, так как она позволяет полностью отказаться от сохранения полного пути к бинарному файлу интерпретатора сценариев после последовательности шебанг (!#). Это полезная практика, так как в одной системе бинарный файл интерпретатора может располагаться в директории /usr/bin, в другой — в директории /usr/local/bin, а в третьей — вообще в директории /opt. Известно, что после последовательности шебанг должен располагаться полный путь к бинарному файлу интерпретатора, но вы также можете разместить после нее полный путь к бинарному файлу утилиты env, которая будет использоваться для получения пути к бинарному файлу интерпретатора. Исходя из этого, вы можете использовать в качестве аргумента рассматриваемой утилиты лишь имя бинарного файла нужного интерпретатора, например, bash:

#!/usr/bin/env bash
...

после чего будет осуществляться автоматический поиск этого бинарного файла директориях поиска (перечисленных в значении переменной PATH) с его последующим запуском, причем все строки после последовательности шебанг будут переданы запущенному интерпретатору.

Примеры использования

Вывод значений всех переменных окружения

Для ознакомления со всеми значениями переменных окружения достаточно выполнить команду env без каких-либо аргументов:

$ env
XDG_MENU_PREFIX=gnome-
LANG=ru_RU.UTF-8
GDM_LANG=ru_RU.UTF-8
...

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

Для изменения значения произвольной переменной окружения перед запуском команды достаточно указать имя этой переменной и ее значение после символа равенства. Например, для вывода времени по Гринвичу достаточно изменить значение переменной окружения TZ:

$ env TZ=GMT date
Ср июл 26 17:50:30 GMT 2017

Исполнение команды лишь с заданными переменными окружения

Для исполнения команды с несколькими пользовательскими переменными окружения следует воспользоваться параметром -i и вручную задать значения необходимых переменных:

$ env -i PWD=/root env
PWD=/root