Environment variables (Русский)
Состояние перевода: На этой странице представлен перевод статьи Environment variables. Дата последней синхронизации: 19 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
- Приложения по умолчанию
- systemd/Пользователь#Переменные окружения
Переменная окружения — именованный объект, содержащий текстовую информацию, которую могут использовать запускаемые программы. Проще говоря, это переменная с именем и значением. Значением такой переменной может быть, например, место размещения исполняемых файлов в системе, имя предпочитаемого текстового редактора или настройки системной локали. Новые в Linux пользователи часто находят такой способ хранения настроек неудобным. Однако переменные окружения позволяют простым и надёжным способом передавать настройки сразу для множества приложений.
Утилиты
Пакет coreutils содержит программы printenv и env. Программа printenv позволяет отобразить список текущих переменных окружения и их значения:
$ printenv
Примечание: Некоторые переменные окружения относятся к конкретному пользователю в системе. Вы можете убедиться в этом, сравнив выводы команды printenv, запущенной обычным пользователем и суперпользователем.
Программа env может быть использована для запуска команд с указанием нового значения переменной окружения. В следующем примере будет запущен xterm, для которого переменная окружения EDITOR имеет значение vim . Такой вызов не затронет переменную окружения EDITOR в текущем сеансе терминала.
$ env EDITOR=vim xterm
Встроенная в командную оболочку команда set(1p) позволяет вам устанавливать значения переменных окружения в текущем сеансе терминала, а также отображать имена и значения переменных окружения текущего сеанса.
Чтобы увидеть переменные окружения конкретных процессов, откройте файл /proc/pid/environ , где pid — числовой идентификатор интересующего процесса. Записи в этом файле отделены друг от друга нулевым байтом ( \x0 ), который обычно не виден в терминале. Вы можете использовать, например, sed для отображения переменных окружения процесса в более читабельном формате, заменив нулевые байты на переносы строки: sed ‘s:\x0:\n:g’ /proc/$PID/environ
Установка переменных
Чтобы избежать замусоривания переменных окружения, стоит по возможности ограничивать области действия переменных. Кроме того, графические сеансы и службы systemd требуют установки переменных в определённых местах, чтобы они сработали. Область действия переменных окружения разделяется на контексты, на которые они влияют:
- системный — все программы у любых пользователей, кроме служб systemd;
- пользовательский — все программы определённого пользователя, кроме служб systemd (смотрите systemd/Пользователь#Переменные окружения) или графических окружений (смотрите раздел #Графические приложения).
На системном уровне
С помощью файлов инициализации оболочки
Большинство дистрибутивов Linux советуют изменять или добавлять переменные окружения в /etc/profile или других местах. Имейте в виду, что сразу множество файлов могут содержать переменные окружения и переопределять их, вроде /etc/locale.conf . По сути, любой скрипт может быть использован для этого, однако по принятым в UNIX соглашениям следует использовать для этого только определённые файлы.
Для установки переменных окружения на уровне всей системы можно использовать следующие файлы (каждый со своими ограничениями):
- /etc/environment используется модулем pam_env. Он не привязан к командным оболочкам, поэтому скрипты или glob-выражения использовать здесь нельзя. Здесь можно указывать только пары имя=значение .
- /etc/profile устанавливает переменные только в оболочках входа (когда пользователь выполняет вход в систему). В нём можно запускать скрипты (например, запускаются скрипты из каталога /etc/profile.d/ ) и он может использоваться в оболочках, совместимых с Bourne shell.
- Файлы настроек, специфичные для конкретных командных оболочек — глобальные файлы настроек для вашей командной оболочки, инициализирует переменные и запускает скрипты. Например, Bash (Русский)#Файлы настроек (например, ~/.bashrc ) или Zsh (Русский)#Файлы запуска/завершения (например, ~/.zshrc ).
Ниже приведён пример скрипта, который создаёт функцию для добавления нескольких каталогов (например, ~/bin и ~/scripts ) в PATH . Чтобы это сделать, просто поместите код в один из системных файлов инициализации окружения ( /etc/profile или /etc/bash.bashrc ):
set_path()< # Проверяем, что id пользователя 1000 или больше [ "$(id -u)" -ge 1000 ] || return for i in "$@"; do # Проверяем существование каталога [ -d "$i" ] || continue # Проверяем, что его ещё нет в $PATH. echo "$PATH" | grep -Eq "(^|:)$i(:|$)" && continue # Затем добавляем в $PATH и экспортируем переменную export PATH="$:$i" done > set_path ~/bin ~/scripts
Одним из способов использования общих переменных окружения в разных оболочках является создание файла без комментариев, пустых строк и пробелов (bash), который может быть прочитан непосредственно программой envsubst (вдохновлено [1]):
EDITOR=vim XDG_CACHE_HOME=$HOME/.cache XDG_CONFIG_HOME=$HOME/.config XDG_DATA_HOME=$HOME/.local/share XDG_STATE_HOME=$HOME/.local/state
bashrc
export $(envsubst < .env)
config/fish/config.fish
export (envsubst < .env)
С помощью pam_env
PAM-модуль pam_env(8) загружает переменные для прописывания в окружение из этих файлов в указанном порядке: /etc/security/pam_env.conf и /etc/environment .
- Эти файлы считываются перед другими файлами, в частности перед ~/.profile , ~/.bash_profile и ~/.zshenv .
- Устаревший файл ~/.pam_environment больше не считывается. Смотрите FS#68945.
/etc/environment должен содержать только простые пары вида ПЕРЕМЕННАЯ=значение на отдельных строках, например:
EDITOR=nano
/etc/security/pam_env.conf имеет формат:
ПЕРЕМЕННАЯ [DEFAULT=значение] [OVERRIDE=значение]
@ и @ являются специальными переменными, значение которых берётся из /etc/passwd . Следующий пример показывает, как использовать переменную HOME внутри другой переменной:
XDG_CONFIG_HOME DEFAULT=@/.config
Примечание: Переменные $ и $ не связаны с переменными окружения HOME и SHELL , по умолчанию они не задаются.
Формат также позволяет расширить уже определённые переменные значениями из других переменных с помощью $ПЕРЕМЕННАЯ> , например:
GOPATH DEFAULT=$/go
Пары ПЕРЕМЕННАЯ=значение тоже допускаются, но расширение переменных здесь не поддерживается. Подробнее смотрите pam_env.conf(5) .
На уровне пользователя
Не всегда требуется устанавливать переменные окружения на уровне системы. Например, вы можете захотеть добавить свой каталог /home/пользователь/bin в PATH , однако не хотите, чтобы это затрагивало других пользователей системы. Пользовательские переменные окружения можно устанавливать во многих файлах:
- Файлы инициализации командной оболочки, например Bash (Русский)#Файлы настроек или Zsh (Русский)#Файлы запуска/завершения.
- Если вы не хотите ограничить область действия переменных только открытыми терминалами (например, только для приложений командной строки), вы скорее всего хотите изменить параметры оболочки входа.
Например, чтобы добавить каталог в PATH , поместите следующее в ~/.bash_profile :
export PATH
Для применения изменений перелогиньтесь или выполните source: $ source ~/.bash_profile .
Примечание: Демон dbus и пользовательский экземпляр systemd не наследуют никакие переменные окружения из мест вроде ~/.bashrc . Это означает, что, например, активируемые через dbus программы вроде GNOME Files не будут использовать их по умолчанию. Смотрите systemd/Пользователь#Переменные окружения.
Совет: С помощью команды export -p можно просмотреть глобальные и локальные переменные окружения, объявленные для пользовательского сеанса.
Графические приложения
Если переменная окружения влияет только на графические приложения, можно ограничить область её применения, установив её только в рамках графического сеанса. В порядке сужения области:
- #На уровне Xorg или #На уровне Wayland — охватывают весь графический сеанс, в том числе наверняка среду рабочего стола;
- #На уровне графического сеанса — охватывает приложения, запущенные в рамках графического сеанса, в том числе, возможно, и среду рабочего стола;
- #На уровне приложения — только для отдельного графического приложения.
На уровне графического сеанса
Некоторые графические окружения (например, KDE Plasma), поддерживают запуск скриптов при входе: можно использовать их для установки переменных окружения. Пример есть в статье KDE (Русский)#Автозапуск приложений.
На уровне Xorg
Установка переменных окружения для сеанса Xorg зависит от того, каким конкретно способом он запускается:
- Большинство экранных менеджеров выполняют source файла xprofile.
- startx и SLiM выполняют xinitrc.
- XDM выполняет ~/.xsession ; смотрите XDM (Русский)#Определение сеанса.
- SDDM дополнительно выполняет source скриптов оболочек входа, вроде ~/.bash_profile для bash или ~/.zprofile и ~/.zlogin для zsh. [2]
Хотя конец скрипта зависит от того, какой это файл, а любой расширенный синтаксис зависит от используемой оболочки, базовое использование универсально:
~/.xprofile, ~/.xinitrc или ~/.xsession
. export ПЕРЕМЕННАЯ=значение .
На уровне Wayland
Так как Wayland не использует Xorg-специфичные файлы, GDM и KDE Plasma вместо них загружают пользовательские переменные окружения systemd.
~/.config/environment.d/envvars.conf
ПЕРЕМЕННАЯ=значение
Другие экранные менеджеры (например, SDDM) пока что не поддерживают это напрямую. Однако SDDM выполняет source скриптов оболочек входа и для сеансов Wayland тоже.
Если ваш экранный менеджер выполняет скрипты запуска вроде ~/.bash_profile и вы хотите использовать environment.d , то с помощью run-parts можно сделать так:
~/.bash_profile
# использует systemd-environment-d-generator(8) для генерации переменных окружения и экспортирует их export $(run-parts /usr/lib/systemd/user-environment-generators | sed '/:$/d; /^$/d' | xargs)
Примечание: Этот код запускает все исполняемые файлы в каталоге /usr/lib/systemd/user-environment-generators , что может быть как желательным, так и нежелательным. Если нужно, запускайте /usr/lib/systemd/user-environment-generators/30-systemd-environment-d-generator напрямую.
На уровне приложения
Чтобы установить переменные окружения только для определённого приложения вместо целого сеанса, измените .desktop файл этого приложения. Смотрите Ярлыки приложений#Изменение переменных окружения.
Для игры из Steam можно настроить окружение, отредактировав её параметры запуска.
На уровне сеанса или оболочки
Иногда бывает нужно установить временную переменную окружения. Например, если нужно временно запускать исполняемые файлы из определённого каталога, но не хочется вводить абсолютный путь к каждому из них или редактировать настройки командной оболочки на время работы с ними.
В таком случае можно определить переменную PATH в текущем сеансе с помощью команды export. Пока командная оболочка продолжает работать, все запускаемые в ней процессы будут использовать изменённое значение переменной.
$ export PATH="$:/home/my_user/tmp/usr/bin"
Примеры
В этом разделе описываются типовые переменные окружения, используемые в Linux.
- XDG_CURRENT_DESKTOP — это переменная freedesktop.org, содержащая список разделённых двоеточиями строк, которыми идентифицируется среда рабочего стола[3]. Стандартные значения — GNOME , GNOME-Flashback , KDE , LXDE , LXQt , MATE , TDE , Unity , XFCE , EDE , Cinnamon , Pantheon и DDE [4].
- Cinnamon был зарегистрирован позже других сред. В итоге некоторые приложения по-прежнему ожидают старое нестандартное значение X-CINNAMON , например Qt[5].
- XDG_SESSION_DESKTOP похожа на XDG_CURRENT_DESKTOP , но допускает использование только одной строки. Несмотря на название, переменная не входит в стандарт freedesktop.org.
- DE — более старая переменная для обозначения текущей среды рабочего стола (Desktop Environment). Её значения не стандартизированы, но можно ориентироваться на xdg-utils как на справочник типовых значений для многих сред рабочего стола.
- DESKTOP_SESSION — ещё одна старая переменная, но используется реже, чем DE . Значение также может быть путём к файлу .desktop сеанса в каталоге /usr/share/xsessions/ [6].
- WINDOW_MANAGER — переменная, иногда используемая для выбораоконного менеджера, который будет использоваться в среде рабочего стола. Это отличает её от других упомянутых здесь переменных, которые устанавливаются уже выбранным экранным менеджером или средой рабочего стола и используется для чтения другими программами.
- PATH содержит список каталогов, разделённых двоеточиями, в которых система ищет исполняемые файлы. Когда обычная команда (например, ls, systemctl или pacman) интерпретируется командной оболочкой (например, bash или zsh), оболочка ищет исполняемый файл с указанным именем в каталогах из этого списка и, если находит, запускает файл, передав ему указанные аргументы командной строки. Чтобы запускать исполняемые файлы, пути к которым не находятся в PATH , необходимо указывать относительный или абсолютный путь к файлу, например ./a.out или /bin/ls .
Примечание: Из соображений безопасности, не рекомендуется включать текущий каталог ( . ) в список PATH , так как это может спровоцировать случайный запуск вредоносного исполняемого файла.
- HOME содержит путь к домашнему каталогу текущего пользователя. Эта переменная может использоваться приложениями для определения расположения файлов настроек пользователя, который их запускает.
- PWD содержит путь к текущему рабочему каталогу.
- OLDPWD содержит путь к предыдущему рабочему каталогу, то есть, значение PWD перед последним вызовом cd.
- TERM содержит тип запущенного терминала, например xterm-256color . Это используется некоторыми программами, которые хотят знать возможности текущего терминала.
- MAIL содержит путь к каталогу, где сохраняется входящая почта. Обычно имеет значение /var/spool/mail/$LOGNAME .
- ftp_proxy и http_proxy содержат адреса прокси-серверов для протоколов FTP и HTTP соответственно:
ftp_proxy="ftp://192.168.0.1:21" http_proxy="http://192.168.0.1:80"
- MANPATH содержит разделённый двоеточиями список каталогов, которые использует man для поиска man-страниц.
Примечание: В /etc/profile есть комментарий "Man is much better than us at figuring this out", так что эту переменную обычно стоит не задавать. Смотрите manpath(5) .
- INFODIR содержит разделённый двоеточиями список каталогов, которые использует info для поиска info-страниц, например /usr/share/info:/usr/local/share/info .
- TZ может использоваться для установки временной зоны. Можно ссылаться на файл из /usr/share/zoneinfo/ , например TZ=":/usr/share/zoneinfo/Europe/Moscow" , тогда перед путём к файлу должно стоять двоеточие (смотрите документацию GNU).
Программы по умолчанию
- SHELL содержит путь к предпочитаемой командной оболочке текущего пользователя. Имейте в виду, что это не обязательно совпадает с текущей работающей оболочкой. Если значение не указано, Bash автоматически устанавливает в качестве её значения оболочку входа, прописанную в файле /etc/passwd , или /bin/sh , если это не удаётся определить.
- PAGER указывает команду для запуска программы постраничного просмотра содержимого текстовых файлов, например, /bin/less .
- EDITOR содержит команду для запуска программы для редактирования текстовых файлов, например /usr/bin/nano . Также можно задать специальную команду, которая будет выбирать редактор в зависимости от окружения, например, gedit в X или nano в терминале, как в этом примере:
[ -n "$DISPLAY" ] && export EDITOR=gedit || export EDITOR=nano
- VISUAL позволяет указать имя продвинутого текстового редактора для более сложных задач, например, редактирования почты. Это могут быть vi , vim, emacs и т. д.
- BROWSER содержит команду для запуска веб-браузера. Может быть полезно устанавливать это значение в зависимости от наличия графического окружения:
[ -n "$DISPLAY" ] && export BROWSER=firefox || export BROWSER=links
Совет: При прописывании программ по умолчанию также можно ориентироваться на переменную WAYLAND_DISPLAY , наличие которой указывает на то, что запущен Wayland-композитор.
Смотрите также
- Gentoo:Handbook:X86/Working/EnvVar
- Ubuntu Community Wiki - Environment Variables
Переменные окружения — Основы командной строки
Команда cd без аргументов делает домашнюю директорию пользователя рабочей. Возникает вопрос, каким образом она узнает о том, где находится домашняя директория?
Можно предположить, что команда cd каким-то образом обращается к операционной системе и узнает у нее эту информацию или смотрит напрямую в конфигурационных файлах. Но ни первого, ни второго она не делает.
Эта команда ориентируется на так называемую переменную окружения, которую мы изучим в этом уроке.
Что такое переменные окружения
Переменные окружения похожи на переменные в языках программирования. Они существуют в рамках запущенной сессии командной оболочки, то есть, переменные пропадут, когда терминал закроется. Они подгружаются туда во время его инициализации, хотя это не единственный путь их появления.
Посмотреть установленные переменные можно командой env (environment). Ниже неполный список этих переменных, которые доступны на одном из серверов Хекслета:
env TERM=xterm-256color SHELL=/bin/bash LC_ALL=en_US.UTF-8 USER=kirill.m HEXLET_VERSION=v2711 PATH=/home/kirill.m/bin:/home/kirill.m/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin PWD=/home/kirill.m LANG=en_US.UTF-8 SHLVL=1 HOME=/home/kirill.m LOGNAME=kirill.m
Формат вывода очень простой: слева от знака равно расположено имя переменной, справа — значение. В вашем случае вывод команды env будет отличаться не только значениями этих переменных, но и их составом. Например, у вас точно не будет HEXLET_VERSION , но наверняка будет HOME , только с другим значением.
Основное предназначение переменных окружения — конфигурирование системы и программ. Их удобство заключается в универсальности. Кроме того, они помогают отвязать нас от способа появления этих значений в системе.
Возьмем для примера ту же команду cd . Она знает лишь то, что домашняя директория доступна в переменной окружения HOME . Как она попала в систему — не важно.
Без переменной окружения пришлось бы делать одну из двух вещей:
- При вызове cd каждый раз указывать, где находится домашняя директория. Например, так: cd --home-dir /home/kirill.m . Такой способ убивает весь смысл быстрого перехода в домашнюю директорию
- Договариваться, что где-то будет храниться специальный файл с настройками, в том числе домашней директории. Настройки из этого файла будут читаться командой cd при каждом запуске
Существует некоторый базовый набор переменных, которые всегда устанавливаются bash при старте. Они используются большим количеством утилит и нужны для нормального функционирования системы. Одну из таких переменных мы уже знаем — это HOME :
# Для вывода переменной используется echo, # а перед самой переменной ставится знак $ echo $HOME /home/kirill.m # Вокруг знака `=` не должно быть пробелов HOME=/tmp echo $HOME /tmp # Возвращаем обратно HOME=/home/kirill.m echo $HOME /home/kirill.m
Теперь проведем эксперимент: попробуем установить HOME и выполнить переход в эту директорию с помощью команды cd , которая должна отправить нас в домашнюю директорию:
# Достаточно выполнить присваивание слева от запускаемой команды HOME=/tmp cd /tmp pwd /tmp
Команда cd выполнила переход по пути, указанном в переменной HOME . Теперь снова сделаем cd , но не добавляя определение переменной слева:
cd pwd /home/kirill.m echo $HOME /home/kirill.m
В этот раз произошел переход в настоящую домашнюю директорию. Получается, что вызов HOME=/tmp cd изменил переменную только для того конкретного запуска. И действительно, существует два способа задавать значение переменной окружения: локальный и глобальный.
Когда мы указали HOME=/tmp прямо перед командой cd , то переменная не была изменена для текущей сессии — она была изменена для запущенной команды, в данном случае cd . Такой трюк можно проделывать с любой командой.
Другой способ установки изменяет значение глобально, для всей сессии и выполняется так:
echo $HOME /home/kirill.m export HOME=/tmp cd pwd /tmp echo $HOME /tmp
Обратите внимание, что изменение происходит в рамках текущей сессии. Другими словами, если у нас открыто две вкладки терминала, то изменение произойдет только в той вкладке, в которой мы написали команду.
Особую роль среди переменных окружения играет PATH — еще одна важная переменная. Сложности с ней возникают настолько часто, что этой переменной посвящен практически целый урок впереди.
Самостоятельная работа
Изучите переменные окружения в вашей локальной среде, набрав команду env .
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар « Как самостоятельно учиться »
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Переменная окружения PATH
Довольно часто на наших курсах нам приходится работать с различными переменными окружения. Особый интерес у учеников вызывает переменная окружения PATH. В этой мини-статье решили рассказать о том, что это за переменная и зачем нужна нашей операционной системе.
Что такое переменная окружения
Для начала давайте определимся с тем, что вообще такое переменная окружения.
Переменная окружения - это то же самое, что и переменная в любом языке программирования. Для тех, кто никогда не писал код, проще всего объяснить это следующим образом. Это некая сущность, у которой есть имя и значение.
Если в языке программирования переменная существует только в рамках какой-то программы, то переменная окружения существует в рамках всей операционной системы и любая программа может к ней обратиться.
Нужны такие переменные как раз для этого - чтобы программы могли к ним обращаться и получать требующуюся им для работы информацию.
Например, давайте представим, что мы пишем программу, которая в ходе своей работы должна взаимодействовать с Java. На каждом компьютере она может находиться в разных местах. У меня в одной директории, у другого человека - в другой. Как нам написать программу, которая работала бы у всех?
Очень просто, мы пишем требование к нашей программе - в системе, где вы будете ее запускать, обязательно должна быть выставлена переменная окружения JAVA_HOME, содержащая путь до Java. Читая значение этой переменной наша программа будет понимать, где искать движок на том компьютере, на котором ее запустили.
Переменная окружения PATH
Переменная окружения PATH нужна прежде всего самой командной строке. Ее значение - это список директорий, в которых хранятся исполняемые файла. Директории перечислены через двоеточие. Например:
Тут две директории, перечисленные через двоеточие:
Сама по себе командная строка не знает, как выполнять какую-либо команду, которую мы вводим. После ее введения оболочка начинает поиск исполняемого файла этой команды как раз среди директорий, перечисленных в PATH.
Переменная окружения PATH существует как в Linux, так и в MacOS и Windows и везде работает одинаково.
По дефолту в PATH лежат только основные директории, но мы можем добавлять туда и новые после установки каких-то новых программ.
Дальнейшие команды будут работать только в командной оболочке bash в операционных системах Linux (например, Ubuntu) и MacOS. Если у вас Windows, повторить их можно, установив специальное расширение cygwin по нашему видео - https://www.youtube.com/watch?v=2csABC85onI
Чтобы узнать, какие директории уже указаны в PATH, можно распечатать ее содержимое:
Если директорий много, в таком виде читать ее содержимое не очень удобно и мы предлагаем использовать следующую команду:
Так получится гораздо нагляднее.
Чтобы узнать, в какой директории лежит исполняемый файл той или иной команды, необходимо ввести команду which. Например, давайте посмотрим, где лежит исполняемый файл команды ls:
Как редактировать переменную окружения PATH?
Для ОС Windows версии 8 и 10:
В строке "Поиск" выполните поиск: Система (Панель управления)
Нажмите на ссылку “Дополнительные параметры системы”
Нажмите “Переменные среды”
В разделе “Переменные среды” выберите переменную среды PATH
Нажмите “Изменить”
Если переменной PATH не существует, нажмите “Создать”
В окне “Изменение системной переменной” (или “Новая системная переменная”) укажите значение переменной среды PATH
Нажмите “ОК”
Откройте заново окно командной строки (если она была открыта)Для MacOS и Linux переменная окружения PATH обычно дополняется через системные файлы .bashrc и .bash_profile
Вот и все, что нужно знать о переменной окружения PATH, чтобы начать с ней работать.
Приходите на наш курс Bash - инструменты тестировщика, там мы рассказываем это и многое другое для того, чтобы наши ученики чувствовали себя уверенным пользователем Linux и MacOS и могли эффективно работать с любой командной оболочкой.
А если хочешь почувствовать себя настоящим профессионалом командной строки, покупай пакет курсов Консольные утилиты PRO с хорошей скидкой.
Учитесь новому каждый день! 🙂
about_Environment_Variables
Описывает, как получить доступ к переменным среды и управлять ими в PowerShell.
Переменные среды хранят данные, используемые операционной системой и другими программами. PowerShell создает следующие переменные среды:
- POWERSHELL_TELEMETRY_OPTOUT
- POWERSHELL_DISTRIBUTION_CHANNEL
- POWERSHELL_UPDATECHECK
- PSExecutionPolicyPreference
- PSModulePath
- PSModuleAnalysisCachePath
- PSDisableModuleAnalysisCacheCleanup
Полные описания этих переменных см. в переменных среды PowerShell этой статьи.
Подробное описание
PowerShell может получить доступ к переменным среды и управлять ими в любой из поддерживаемых платформ операционной системы. Поставщик среды PowerShell позволяет получать, добавлять, изменять, очищать и удалять переменные среды в текущей консоли.
В отличие от Windows, имена переменных среды в macOS и Linux чувствительны к регистру. Например, $env:Path это $env:PATH разные переменные среды на платформах, отличных от Windows.
Переменные среды, в отличие от других типов переменных в PowerShell, всегда хранятся в виде строк. Кроме того, в отличие от других переменных, они наследуются дочерними процессами, такими как локальные фоновые задания и сеансы, в которых выполняются члены модуля. Это делает переменные среды хорошо подходят для хранения значений, необходимых как в родительских, так и в дочерних процессах.
В Windows переменные среды можно определить в трех область:
- Область компьютера (или системы)
- Область пользователя
- Область процесса
Область процесса содержит переменные среды, доступные в текущем процессе или сеансе PowerShell. Этот список переменных наследуется от родительского процесса и создается из переменных в область компьютера и пользователя.
При изменении переменных среды в PowerShell изменение влияет только на текущий сеанс. Это поведение напоминает поведение set команды в командной оболочке Windows и setenv команде в средах на основе UNIX. Чтобы изменить значения в область machine или User, необходимо использовать методы класса System.Environment.
Чтобы внести изменения в переменные machine-область d, необходимо также иметь разрешение. Если вы пытаетесь изменить значение без достаточного разрешения, команда завершается ошибкой, и PowerShell отображает ошибку.
PowerShell предоставляет несколько различных методов использования переменных среды и управления ими.
- Синтаксис переменной
- Командлеты поставщика среды и элемента
- Класс .NET System.Environment
Использование синтаксиса переменной
Можно отобразить и изменить значения переменных среды с помощью следующего синтаксиса:
Например, чтобы отобразить значение переменной WINDIR среды:
$Env:windir
C:\Windows
В этом синтаксисе знак доллара ( $ ) указывает переменную, а имя диска ( Env: ) указывает переменную среды, за которой следует имя переменной ( windir ).
Можно создать и обновить значение переменных среды с помощью следующего синтаксиса:
Например, чтобы создать Foo переменную среды:
$Env:Foo = 'An example'
Так как переменные среды всегда являются строками, их можно использовать как любую другую переменную, содержащую строку. Например:
"The 'Foo' environment variable is set to: $Env:Foo" $Env:Foo += '!' $Env:Foo
The 'Foo' environment variable is set to: An example An example!
В PowerShell переменная среды не может быть задана в пустую строку. Задание переменной среды или $null пустой строки удаляет ее из текущего сеанса. Например:
$Env:Foo = '' $Env:Foo | Get-Member -MemberType Properties
Get-Member : You must specify an object for the Get-Member cmdlet. At line:1 char:12 + $env:foo | Get-Member + ~~~~~~~~~~ + CategoryInfo : CloseError: (:) [Get-Member], InvalidOperationException + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand
Get-Member Возвращает ошибку, так как переменная среды была удалена. Вы увидите, что при использовании не возвращается ошибка при использовании в пустой строке:
'' | Get-Member -MemberType Properties
TypeName: System.String Name MemberType Definition ---- ---------- ---------- Length Property int Length
Дополнительные сведения о переменных в PowerShell см. в about_Variables .
Использование командлетов поставщика среды и элементов
Поставщик среды PowerShell предоставляет интерфейс для взаимодействия с переменными среды в формате, который похож на диск файловой системы. Он позволяет получать, добавлять, изменять, очищать и удалять переменные среды и значения в PowerShell.
Например, чтобы создать Foo переменную среды со значением Bar :
New-Item -Path Env:\Foo -Value 'Bar'
Name Value ---- ----- Foo Bar
Можно также скопировать переменную среды с Copy-Item помощью , задать значение переменной среды с Set-Item помощью списка переменных Get-Item среды и удалить переменную среды с Remove-Item помощью.
Copy-Item -Path Env:\Foo -Destination Env:\Foo2 -PassThru Set-Item -Path Env:\Foo2 -Value 'BAR' Get-Item -Path Env:\Foo* Remove-Item -Path Env:\Foo* -Verbose
Name Value ---- ----- Foo2 Bar Name Value ---- ----- Foo2 BAR Foo Bar VERBOSE: Performing the operation "Remove Item" on target "Item: Foo2". VERBOSE: Performing the operation "Remove Item" on target "Item: Foo".
Get-ChildItem Используйте командлет, чтобы просмотреть полный список переменных среды:
Get-ChildItem Env:
Дополнительные сведения об использовании поставщика среды для управления переменными среды см. в about_Environment_Provider .
Использование методов System.Environment
Класс System.Environment предоставляет методы GetEnvironmentVariable и SetEnvironmentVariable для получения и изменения переменных среды.
В следующем примере создается новая переменная среды с Foo значением Bar , а затем возвращается его значение.
[Environment]::SetEnvironmentVariable('Foo','Bar') [Environment]::GetEnvironmentVariable('Foo')
Переменную среды можно удалить с помощью метода SetEnvironmentVariable , указав пустую строку для значения переменной. Например, чтобы удалить Foo переменную среды, выполните следующие действия.
[Environment]::SetEnvironmentVariable('Foo','') [Environment]::GetEnvironmentVariable('Foo')
Дополнительные сведения о методах класса System.Environment см. в разделе "Методы среды".
Сохранение изменений в переменных среды
В Windows существует три метода для постоянного изменения переменной среды: настройка их в профиле с помощью метода SetEnvironmentVariable и использования System панель управления.
Сохранение переменных среды в профиле
Любая переменная среды, которую вы добавляете или изменяете в профиле PowerShell, доступна в любом сеансе, который загружает профиль. Этот метод работает для любой версии PowerShell на любой поддерживаемой платформе.
Например, чтобы создать CompanyUri переменную среды и обновить Path переменную среды, чтобы включить C:\Tools папку, добавьте следующие строки в профиль PowerShell:
$Env:CompanyUri = 'https://internal.contoso.com' $Env:Path += ';C:\Tools'
В Linux или macOS двоеточие () используется вместо запятой( : ; ) для разделения нового пути от пути, который предшествует ему в списке.
Путь к профилю PowerShell можно получить с помощью автоматической переменной $PROFILE . Дополнительные сведения о профилях см. в about_Profiles .
Сохранение переменных среды с помощью SetEnvironmentVariable
В Windows можно указать область для метода SetEnvironmentVariable в качестве третьего параметра, чтобы задать переменную среды в этой область. Компьютер и пользователь область сохраняются вне текущего процесса, что позволяет сохранить новую или измененную переменную среды.
Например, чтобы сохранить новую переменную Foo среды со значением Bar на компьютере область:
[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'Machine')
Переменную среды можно удалить из область пользователя или компьютера, задав значение переменной пустой строке.
[Environment]::SetEnvironmentVariable('Foo', '', 'Machine')
Сохранение переменных среды с помощью системных панель управления
В системе панель управления можно добавить или изменить существующие переменные среды в область пользователей и системы (компьютер). Windows записывает эти значения в реестр, чтобы они сохранялись в сеансах и перезагрузках системы.
Чтобы внести постоянное изменение в переменную среды в Windows с помощью System панель управления:
- Откройте панель управления системы.
- Выберите Система.
- Выберите "Расширенная система" Параметры.
- Перейдите на вкладку "Дополнительно ".
- Выберите переменные среды. .
- Внесите нужные изменения.
Переменные среды PowerShell
Функции PowerShell могут использовать переменные среды для хранения пользовательских настроек. Эти переменные работают как переменные предпочтения, но они наследуются дочерними сеансами сеансов, в которых они созданы. Дополнительные сведения о переменных предпочтениях см. в about_Preference_Variables .
Переменные среды, в которых хранятся настройки, включают:
- POWERSHELL_TELEMETRY_OPTOUT Чтобы отказаться от телеметрии, задайте для переменной true среды значение , yes или 1 . Дополнительные сведения см. в about_Telemetry .
- POWERSHELL_DISTRIBUTION_CHANNEL Начиная с PowerShell 7.2, эта переменная среды устанавливается пакетами установщика для записи метода и источника установки для PowerShell. Эти сведения включаются в данные телеметрии, отправляемые корпорации Майкрософт. Пользователи не должны изменять это значение.
- POWERSHELL_UPDATECHECK Настроить уведомления об обновлениях можно с помощью переменной среды POWERSHELL_UPDATECHECK . Поддерживаются следующие значения:
- Off Отключает функцию уведомления об обновлении
- Default совпадает с определением POWERSHELL_UPDATECHECK :
- В общедоступных выпусках выводятся уведомления об обновлениях для общедоступных выпусков.
- В предварительных выпусках и релизах-кандидатах выводятся уведомления об обновлениях для общедоступных и предварительных выпусков.
Дополнительные сведения см. в about_Update_Notifications .
- Запустите сеанс из командной строки с помощью параметра ExecutionPolicy , чтобы задать политику выполнения для сеанса.
- Воспользуйтесь командлетом Set-ExecutionPolicy . Используйте параметр Scope со значением Process . Дополнительную информацию см. в разделе about_Execution_Policies.
- Расположения на уровне системы: эти папки содержат модули, которые поставляется с помощью PowerShell. Модули хранятся в расположении $PSHOME\Modules . Кроме того, это расположение, в котором установлены модули управления Windows.
- Установленные пользователем модули: это модули, установленные пользователем. Install-Module имеет параметр Scope, позволяющий указать, установлен ли модуль для текущего пользователя или для всех пользователей. Дополнительные сведения см. в разделе Install-Module.
- В Windows расположение область для конкретного пользователя CurrentUser является папкой $HOME\Documents\PowerShell\Modules . Расположение область $env:ProgramFiles\PowerShell\Modules AllUsers.
- В системах, отличных от Windows, расположение пользовательского область CurrentUser — $HOME/.local/share/powershell/Modules это папка. Расположение область /usr/local/share/powershell/Modules AllUsers.
Кроме того, программы установки, устанавливающие модули в других каталогах, например каталог Program Files, могут добавлять их расположения к значению $env:PSModulePath .
Дополнительные сведения см. здесь: about_PSModulePath.
- Windows PowerShell 5.1: $env:LOCALAPPDATA\Microsoft\Windows\PowerShell .
- PowerShell 6.0 и выше: $env:LOCALAPPDATA\Microsoft\PowerShell
- По умолчанию, отличный от Windows: ~/.cache/powershell
Имя файла по умолчанию для кэша ModuleAnalysisCache . При установке нескольких экземпляров PowerShell имя файла включает шестнадцатеричный суффикс, чтобы для каждой установки существовал уникальный имя файла.
Если обнаружение команд работает неправильно, например IntelliSense показывает команды, которые не существуют, можно удалить файл кэша. Кэш повторно создается при следующем запуске PowerShell.
Чтобы изменить расположение кэша по умолчанию, присвойте значение переменной среды перед запуском PowerShell. Изменения в этой переменной среды влияют только на дочерние процессы. Значение должно быть полным путем (включая имя файла), на создание и запись файлов по которому у среды PowerShell есть разрешение.
Чтобы отключить файловый кэш, укажите в качестве этого значения недопустимое расположение, например:
# `NUL` here is a special device on Windows that can't be written to, # on non-Windows you would use `/dev/null` $env:PSModuleAnalysisCachePath = 'NUL'
Это задает путь к устройству NUL . PowerShell не может записывать данные в путь, но не возвращается ошибка. Вы можете увидеть ошибки, сообщаемые с помощью трассировщика:
Trace-Command -PSHost -Name Modules -Expression
Другие переменные среды, используемые PowerShell
Сведения о пути
- PATH Переменная $env:PATH среды содержит список расположений папок, которые операционная система ищет исполняемые файлы. В Windows список расположений папок разделен символом с запятой ( ; ). На платформах, отличных от Windows, двоеточие ( : ) отделяет расположения папок в переменной среды.
- PATHEXT Переменная $env:PATHEXT содержит список расширений файлов, которые Windows считает исполняемыми файлами. Если файл скрипта с одним из перечисленных расширений выполняется из PowerShell, скрипт выполняется в текущем сеансе консоли или терминала. Если расширение файла не указано, скрипт запускается в новом сеансе консоли. Чтобы убедиться, что скрипты для другого языка сценариев выполняются в текущем сеансе консоли, добавьте расширение файла, используемое языком сценариев. Например, чтобы запустить скрипты Python в текущей консоли, добавьте .py расширение в переменную среды. Для поддержки .py расширения в виде исполняемого файла необходимо зарегистрировать расширение с помощью ftype командной оболочки CMD и assoc команд. PowerShell не имеет прямого метода регистрации обработчика файлов. Дополнительные сведения см. в документации по команде ftype . Скрипты PowerShell всегда начинаются в текущем сеансе консоли. Вам не нужно добавлять .PS1 расширение.
- Переменные XDG На платформах, отличных от Windows, PowerShell использует следующие переменные среды XDG, определенные спецификацией базового каталога XDG.
- XDG_CONFIG_HOME
- XDG_DATA_HOME
- XDG_CACHE_HOME
Функции терминала
Начиная с PowerShell 7.2, можно использовать следующие переменные среды для управления функциями виртуального терминала, такими как escape-последовательности ANSI, которые цветуют выходные данные. Поддержку escape-последовательностей ANSI можно отключить с помощью переменных среды TERM или NO_COLOR.
- ТЕРМИН Следующие значения $env:TERM изменяют поведение следующим образом:
- dumb -Задает $Host.UI.SupportsVirtualTerminal = $false
- xterm-mono -Задает $PSStyle.OutputRendering = PlainText
- xtermm -Задает $PSStyle.OutputRendering = PlainText
См. также
- about_Environment_Provider
- about_Profiles
- about_Variables
- Методы среды
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.