Команда 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