linux environment

env

Показать переменные окружения или запустить программу в изменённом окружении

Описание

Команда env выводит все переменные окружения текущей сессии. Каждый процесс в Linux наследует копию окружения родителя — список пар ИМЯ=ЗНАЧЕНИЕ, которые формируют рабочий контекст: пути к программам (PATH), домашний каталог (HOME), язык системы (LANG) и многое другое.

Помимо просмотра, env позволяет запустить команду с временно изменённым окружением — не меняя текущую сессию. Это удобно при отладке, тестировании или запуске программ, требующих особых переменных.

Важно: env показывает только экспортированные переменные (помеченные через export). Локальные переменные оболочки (без export) в списке не появятся.

Синтаксис

# Вывести все переменные окружения env # Фильтровать по имени через grep env | grep VAR_NAME # Запустить команду с временной переменной (не меняет текущую сессию) env VAR=value command # Запустить в полностью пустом окружении env -i command

Флаги и опции

ФлагОписаниеПример
-i, --ignore-environment Запустить команду в полностью пустом окружении (без наследования переменных) env -i bash
-u NAME, --unset=NAME Убрать переменную NAME из окружения перед запуском команды (только для этого запуска) env -u LANG python3 script.py
-0, --null Разделять строки вывода нулевым символом (\0) вместо перевода строки — удобно для xargs -0 env -0 | xargs -0 -n1
--help Показать справку по использованию и выйти env --help
--version Показать версию утилиты и выйти env --version

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

Просмотр всех переменных окружения

# Вывести все переменные текущей сессии
env
# PATH=/usr/local/bin:/usr/bin:/bin
# HOME=/home/user
# LANG=en_US.UTF-8
# TERM=xterm-256color
# ...и многое другое

Фильтрация своей переменной

# Проверить, объявлена ли переменная
export ANDREW_VAR=mygroup
env | grep ANDREW
# ANDREW_VAR=mygroup

# Фильтрация по PATH
env | grep PATH
# PATH=/usr/local/bin:/usr/bin:/bin

Запуск с временной переменной

# Запустить скрипт с переопределённой переменной
# Текущая сессия НЕ изменяется
env MY_VAR=hello ./script.sh

# Несколько переменных сразу
env DB_HOST=localhost DB_PORT=5432 python3 app.py

Запуск в чистом окружении

# Проверить поведение программы без окружения
env -i bash --norc --noprofile
# (запустится bash без переменных родителя)

# Убрать одну переменную для запуска
env -u HOME python3 setup.py

Советы и предупреждения

Совет: env vs printenv
env (без аргументов) и printenv выводят примерно одно и то же — экспортированные переменные. Разница: printenv VARNAME выводит только одну переменную, env VAR=val cmd запускает команду с изменённым окружением. Для просмотра используйте любую; для запуска с переменной — только env.
Совет: только экспортированные переменные
env показывает только переменные, помеченные через export. Если вы объявили MY_VAR=hello без export, в выводе env её не будет. Чтобы переменная попала в окружение и была видна дочерним процессам — всегда используйте export MY_VAR=hello.
Совет: shebang с env для переносимых скриптов
В bash-скриптах часто пишут #!/usr/bin/env bash вместо #!/bin/bash. Это позволяет системе найти bash через PATH, что делает скрипт переносимым между системами, где bash находится в разных местах. ⚠️ Проверить по документации