Emacs 通过多种函数提供对操作系统环境变量的访问。 这些变量包括系统名称、用户的 UID 等。
该变量以字符串形式保存当前系统软硬件对应的标准 GNU 配置名称。 例如,64 位 GNU/Linux 系统的典型取值为 ‘"x86_64-unknown-linux-gnu"’。
该变量的值是一个符号,用于表示 Emacs 所运行的操作系统类型。 可能的取值如下:
aixIBM 的 AIX 系统。
berkeley-unix伯克利 BSD 及其衍生版本。
cygwinCygwin,运行于 MS-Windows 之上的 POSIX 兼容层。
darwinDarwin(macOS)。
gnuGNU 系统(使用由 HURD 和 Mach 组成的 GNU 内核)。
gnu/linuxGNU/Linux 系统——即采用 Linux 内核的 GNU 系统变体。 (人们常将这类系统简称为“Linux”,但实际上 Linux 只是内核,而非完整系统。)
gnu/kfreebsd采用 FreeBSD 内核、基于 GNU(glibc)的系统。
haikuHaiku 操作系统,BeOS 的后继系统。
hpux惠普 HPUX 操作系统。
nacl谷歌原生客户端(NaCl)沙箱系统。
android开放手机联盟的 Android 操作系统。
ms-dos微软 DOS 系统。使用 DJGPP 为 MS-DOS 编译的 Emacs,
即使运行在 MS-Windows 上,也会将 system-type 设为 ms-dos。
usg-unix-vAT&T Unix System V。
windows-nt微软 Windows NT、9X 及后续版本。
即使在 Windows 10 上,system-type 的值也始终为 windows-nt。
除非绝对必要,我们不希望新增符号来做更细粒度的区分!
事实上,我们未来希望精简掉其中部分取值。
如果你需要比 system-type 更精细的区分,可以通过正则表达式等方式检测 system-configuration。
该函数以字符串形式返回当前运行 Emacs 的主机名称。
如果该变量非 nil,在生成电子邮件地址时会使用该值而非 system-name。
例如,在构造 user-mail-address 的默认值时会用到。See 用户标识。
该函数以字符串形式返回环境变量 var 的值。var 应为字符串。
如果环境中未定义 var,则 getenv 返回 nil。
如果 var 已设置但为空,则返回 ‘""’。
在 Emacs 内部,环境变量及其值的列表保存在变量 process-environment 中。
(getenv "USER")
⇒ "lewis"
Shell 命令 printenv 用于打印全部或部分环境变量:
bash$ printenv PATH=/usr/local/bin:/usr/bin:/bin USER=lewis
TERM=xterm SHELL=/bin/bash HOME=/home/lewis
...
该命令将名为 variable 的环境变量设置为 value。
variable 应为字符串。
Emacs Lisp 内部可以处理任意字符串,但通常 variable 应为合法的 Shell 标识符,
即由字母、数字、下划线组成,且以字母或下划线开头。
否则,当 Emacs 的子进程尝试访问该变量时可能出错。
如果省略 value 或其为 nil(交互模式下使用前缀参数时),
setenv 会从环境中移除 variable。
其他情况下 value 应为字符串。
如果可选参数 substitute 非 nil,Emacs 会调用函数 substitute-env-vars
展开 value 中的环境变量。
setenv 通过修改 process-environment 生效;
使用 let 绑定该变量也是合理的用法。
setenv 返回 variable 的新值,若从环境中移除了该变量则返回 nil。
该宏在执行 body 时,根据 variables 临时设置环境变量,
代码块执行完毕后恢复原有值。
参数 variables 应为形如 (var value) 的字符串对列表,
其中 var 为环境变量名,value 为对应的值。
(with-environment-variables (("LANG" "C")
("LANGUAGE" "en_US:en"))
(call-process "ls" nil t))
该变量是一个字符串列表,每个元素描述一个环境变量。
函数 getenv 和 setenv 均基于该变量工作。
process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
"USER=lewis"
"TERM=xterm"
"SHELL=/bin/bash"
"HOME=/home/lewis"
...)
如果 process-environment 中有多个元素指定了同一个环境变量,
只有第一个生效,其余会被忽略。
该变量保存 Emacs 启动时从父进程继承而来的环境变量列表。
该变量为字符串,表示搜索路径(来自环境变量)中分隔目录的字符。
在 Unix 与 GNU 系统上为 ":",在微软系系统上为 ";"。
该函数返回变量 path-separator 的连接本地值。
对于本地微软系系统及 default-directory 为 ";",
对于 Unix、GNU 系统或远程 default-directory 为 ":"。
该函数接收类似 PATH 环境变量的路径字符串,按分隔符拆分并返回目录列表。
列表中的 nil 表示当前目录。
尽管函数名包含 “colon”,实际使用的是变量 path-separator 的值。
(parse-colon-path ":/foo:/bar")
⇒ (nil "/foo/" "/bar/")
该变量保存 Emacs 被调用时的程序名,为字符串,不包含目录部分。
该变量保存 Emacs 运行时可执行文件所在目录,若无法确定则为 nil。
若该变量非 nil,则为查找 lib-src 和 etc 子目录的基准目录。
在已安装的 Emacs 中通常为 nil。
当 Emacs 无法在标准安装位置找到这些目录,
但能在与 Emacs 可执行文件所在目录(即 invocation-directory)相关的目录中找到时,该值非空。
该函数以列表形式返回系统当前 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)
Shell 命令 uptime 会返回类似信息。
该函数以整数形式返回 Emacs 进程的 ID。
该变量保存 Emacs 启动前,系统终端驱动中设定的删除字符。
该变量保存系统空设备。Unix 与 GNU 系统为 "/dev/null",
微软系系统为 "NUL"。
该函数返回变量 null-device 的连接本地值。
对于本地微软系系统及 default-directory 为 "NUL",
对于 Unix、GNU 系统或远程 default-directory 为 "/dev/null"。