43.3 Окружение операционной системы

Emacs предоставляет доступ к переменным окружения операционной системы через различные функции. Эти переменные включают имя системы, UID пользователя и так далее.

Переменная: system-configuration

Эта переменная содержит стандартное имя конфигурации GNU для аппаратной/программной конфигурации вашей системы в виде строки. Например, типичное значение для 64-битной системы GNU/Linux — ‘"x86_64-unknown-linux-gnu"’.

Переменная: system-type

Значение этой переменной — символ, указывающий тип операционной системы, в которой работает Emacs. Возможные значения:

aix

AIX от IBM.

berkeley-unix

Berkeley BSD и его варианты.

cygwin

Cygwin — уровень POSIX поверх MS-Windows.

darwin

Darwin (macOS).

gnu

Система GNU (с использованием ядра GNU, состоящего из HURD и Mach).

gnu/linux

Система GNU/Linux — то есть вариант системы GNU с использованием ядра Linux. (Эти системы часто называют просто “Linux”, но на самом деле Linux — это только ядро, а не вся система.)

gnu/kfreebsd

Система GNU (на базе glibc) с ядром FreeBSD.

haiku

Операционная система Haiku — производная от Be Operating System.

hpux

Операционная система HPUX от Hewlett-Packard.

nacl

Система изоляции Google Native Client (NaCl).

android

Операционная система Android от Open Handset Alliance.

ms-dos

DOS от Microsoft. Emacs, скомпилированный с DJGPP для MS-DOS, привязывает system-type к ms-dos, даже если вы запускаете его в MS-Windows.

usg-unix-v

AT&T Unix System V.

windows-nt

Microsoft Windows NT, 9X и более поздние. Значение system-type всегда равно windows-nt, например, даже в Windows 10.

Мы не хотим добавлять новые символы для более тонких различий, если это абсолютно не необходимо! Фактически, мы надеемся в будущем исключить некоторые из этих вариантов. Если вам нужно провести более тонкое различие, чем позволяет system-type, вы можете проверить system-configuration, например, с помощью регулярного выражения.

Функция: system-name

Эта функция возвращает имя машины, на которой вы работаете, в виде строки.

Пользовательская опция: mail-host-address

Если эта переменная не равна nil, она используется вместо system-name для целей формирования адресов электронной почты. Например, она используется при построении значения по умолчанию для user-mail-address. См. Идентификация пользователя.

Команда: getenv var &optional frame

Эта функция возвращает значение переменной окружения var в виде строки. var должна быть строкой. Если var не определена в окружении, getenv возвращает nil. Она возвращает ‘""’, если var установлена, но пуста. Внутри Emacs список переменных окружения и их значений хранится в переменной process-environment.

(getenv "USER")
     ⇒ "lewis"

Команда оболочки printenv выводит всё или часть окружения:

bash$ printenv
PATH=/usr/local/bin:/usr/bin:/bin
USER=lewis
TERM=xterm
SHELL=/bin/bash
HOME=/home/lewis
…
Команда: setenv variable &optional value substitute

Эта команда устанавливает значение переменной окружения с именем variable в value. variable должна быть строкой. Внутренне Emacs Lisp может обрабатывать любую строку. Однако обычно variable должна быть допустимым идентификатором оболочки, то есть последовательностью букв, цифр и знаков подчёркивания, начинающейся с буквы или подчёркивания. В противном случае могут возникать ошибки, если дочерние процессы Emacs попытаются получить доступ к значению variable. Если value опущена или равна nil (или, в интерактивном режиме, с префиксным аргументом), setenv удаляет variable из окружения. В противном случае value должна быть строкой.

Если необязательный аргумент substitute не равен nil, Emacs вызывает функцию substitute-env-vars для подстановки всех переменных окружения в value.

setenv работает путём изменения process-environment; связывание этой переменной с помощью let также является разумной практикой.

setenv возвращает новое значение variable или nil, если она удалила variable из окружения.

Макрос: with-environment-variables variables body…

Этот макрос временно устанавливает переменные окружения согласно variables при выполнении body. Предыдущие значения восстанавливаются после завершения формы. Аргумент variables должен быть списком пар строк вида (var value), где var — имя переменной окружения, а value — её значение.

(with-environment-variables (("LANG" "C")
                             ("LANGUAGE" "en_US:en"))
  (call-process "ls" nil t))
Переменная: process-environment

Эта переменная представляет собой список строк, каждая из которых описывает одну переменную окружения. Функции getenv и setenv работают посредством этой переменной.

process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
    "USER=lewis"
    "TERM=xterm"
    "SHELL=/bin/bash"
    "HOME=/home/lewis"
    …)

Если process-environment содержит несколько элементов, задающих одну и ту же переменную окружения, первый из этих элементов определяет переменную, а остальные игнорируются.

Переменная: initial-environment

Эта переменная содержит список переменных окружения, унаследованных Emacs от родительского процесса при запуске Emacs.

Переменная: path-separator

Эта переменная содержит строку, указывающую, какой символ разделяет каталоги в пути поиска (как указано в переменной окружения). Её значение — ":" для систем Unix и GNU и ";" для систем MS.

Функция: path-separator

Эта функция возвращает значение переменной path-separator, привязанное к конкретному соединению. То есть ";" для систем MS и локального default-directory и ":" для систем Unix и GNU или удалённого default-directory.

Функция: parse-colon-path path

Эта функция принимает строку пути поиска, например, значение переменной окружения PATH, и разбивает её по разделителям, возвращая список каталогов. nil в этом списке означает текущий каталог. Хотя в названии функции сказано “colon”, на самом деле она использует значение переменной path-separator.

(parse-colon-path ":/foo:/bar")
     ⇒ (nil "/foo/" "/bar/")
Переменная: invocation-name

Эта переменная содержит имя программы, под которым был вызван Emacs. Значение — строка, не включающая имя каталога.

Переменная: invocation-directory

Эта переменная содержит каталог, в котором находился исполняемый файл Emacs при его запуске, или nil, если этот каталог не может быть определён.

Переменная: installation-directory

Если не равна nil, это каталог, в котором следует искать подкаталоги lib-src и etc. В установленном Emacs обычно равна nil. Она не равна nil, когда Emacs не может найти эти каталоги в стандартных установленных местах, но может найти их в каталоге, связанном каким-либо образом с каталогом, содержащим исполняемый файл Emacs (т.е. invocation-directory).

Функция: load-average &optional use-float

Эта функция возвращает текущую среднюю загрузку системы за 1, 5 и 15 минут в виде списка. Средняя загрузка указывает на количество процессов, пытающихся выполняться в системе.

По умолчанию значения являются целыми числами, в 100 раз превышающими среднюю загрузку системы, но если use-float не равен nil, то они возвращаются как числа с плавающей точкой без умножения на 100.

Если невозможно получить среднюю загрузку, эта функция вызывает ошибку. На некоторых платформах доступ к средней загрузке требует установки Emacs с setuid или setgid, чтобы он мог читать информацию ядра, и обычно это не рекомендуется.

Если доступна средняя загрузка за 1 минуту, но средние за 5 или 15 минут недоступны, эта функция возвращает сокращённый список, содержащий доступные средние значения.

(load-average)
     ⇒ (169 48 36)
(load-average t)
     ⇒ (1.69 0.48 0.36)

Команда оболочки uptime выдаёт аналогичную информацию.

Функция: emacs-pid

Эта функция возвращает идентификатор процесса ID процесса Emacs в виде целого числа.

Переменная: tty-erase-char

Эта переменная содержит символ стирания, выбранный в драйвере терминала системы до запуска Emacs.

Переменная: null-device

Эта переменная содержит системное пустое устройство. Её значение — "/dev/null" для систем Unix и GNU и "NUL" для систем MS.

Функция: null-device

Эта функция возвращает значение переменной null-device, привязанное к конкретному соединению. То есть "NUL" для систем MS и локального default-directory, и "/dev/null" для систем Unix и GNU или удалённого default-directory.