环境变量
ssk-wh Lv4

image

在 Linux 系统中,环境变量用于定义系统运行环境的一些参数。例如,家目录的位置一般存放在 HOME 环境变量中,可以通过执行 echo $HOME 命令来查看。

常见环境变量

我们可以使用 env 命令来查看 Linux 系统中所有的环境变量。执行该命令的方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[11:01:53] uos :: uos-PC  ➜  ~ » env
CLUTTER_IM_MODULE=fcitx
COLORTERM=truecolor
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
DESKTOP_SESSION=deepin
DISPLAY=:0
D_DISABLE_RT_SCREEN_SCALE=1
D_DXCB_FORCE_OVERRIDE_HIDPI=1
GDK_BACKEND=x11
GDMSESSION=Wayland
GIO_LAUNCHED_DESKTOP_FILE=/usr/share/applications/deepin-terminal.desktop
GIO_LAUNCHED_DESKTOP_FILE_PID=11851
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1
GTK_IM_MODULE=fcitx
GTK_MODULES=gail:atk-bridge
HOME=/home/uos
IM_CONFIG_CHECK_ENV=1
IM_CONFIG_PHASE=1
INPUT_METHOD=fcitx
KWIN_USE_BUFFER_AGE=1
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
LOGNAME=uos
PATH=/home/uos/.autojump/bin:/home/uos/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin
PWD=/home/uos
QT_ACCESSIBILITY=1
QT_DBL_CLICK_DIST=15
QT_IM_MODULE=fcitx
QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
QT_LOGGING_RULES=kwin*=true;kwin_libinput=false;
QT_PLUGIN_PATH=/usr/lib/aarch64-linux-gnu/qt5/plugins
QT_QPA_PLATFORM=
QT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough
QT_WAYLAND_FORCE_DPI=96
QT_WAYLAND_SHELL_INTEGRATION=kwayland-shell
SDL_IM_MODULE=fcitx
SHELL=/bin/bash
SHLVL=1
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
SYS_PRODUCT_NAME=
TERM=xterm-256color
USER=uos
WAYLAND_DISPLAY=wayland-0
WINDOWID=0
XCURSOR_SIZE=24
XDG_CURRENT_DESKTOP=Deepin
XDG_GREETER_DATA_DIR=/var/lib/lightdm/data/uos
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=Wayland
XDG_SESSION_ID=2
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SESSION_TYPE=wayland
XDG_VTNR=1
XMODIFIERS=@im=fcitx
auto_proxy=https://it.uniontech.com/proxy/proxy.pac
OLDPWD=/home/uos
ZSH=/home/uos/.oh-my-zsh
PAGER=less
LESS=-R
LSCOLORS=Gxfxcxdxbxegedabagacad
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
AUTOJUMP_SOURCED=1
AUTOJUMP_ERROR_PATH=/home/uos/.local/share/autojump/errors.log
_=/usr/bin/env
[11:01:56] uos :: uos-PC ➜ ~ »

为了使Linux系统能够正常运行并为用户提供服务,需要数百个环境变量协同工作。然而,我们并不需要逐一学习每个变量。下表列出了 10 个非常重要的环境变量,详见表1

环境变量名称 作用
HOME 用户的主目录(也称家目录)
SHELL 用户使用的 Shell 解释器名称
PATH 定义命令行解释器搜索用户执行命令的路径
EDITOR 用户默认的文本解释器
RANDOM 生成一个随机数字
LANG 系统语言、语系名称
HISTSIZE 输出的历史命令记录条数
HISTFILESIZE 保存的历史命令记录条数
PS1 Bash解释器的提示符
MAIL 邮件保存路径

请注意:上述变量的名称并不固定。例如,在某些Linux系统中,HOSTNAME 可能被设置为 HOST

Linux环境变量分类

按照生命周期来分,Linux环境变量可以分为两类:

  1. 永久的:需要用户修改相关的配置文件,变量将永久生效。
  2. 临时的:用户利用 export 命令在当前终端下声明环境变量,关闭Shell终端后该变量将失效。

按照作用域来分,Linux环境变量可以分为:

  1. 系统环境变量:系统环境变量对该系统中所有用户都有效。
  2. 用户环境变量:这种类型的环境变量只对特定的用户有效。

设置环境变量的方法

(1). 在/etc/profile文件中添加环境变量(对所有用户生效)

要在 /etc/profile 文件中添加一个变量,使其对所有用户生效并且是“永久的”,可以按照以下步骤进行:

  1. 打开终端并以管理员身份登录。

  2. 使用文本编辑器(例如vim)打开 /etc/profile 文件。例如,执行以下命令打开文件:

    1
    sudo vim /etc/profile
  3. 在文件末尾添加所需的变量,例如 CLASSPATH。例如:

    1
    export CLASSPATH=/usr/local/lib

    这将在每次系统启动时为所有用户设置 CLASSPATH 环境变量。

  4. 保存并关闭文件。

现在,新添加的环境变量将对所有用户生效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[10:55:16] uos :: uos-PC  ➜  ~ » cat /etc/profile                
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/sbin:/usr/sbin"
fi
export PATH

if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi

if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
tty | egrep -q tty[1-6] && export LC_ALL=C

tty | egrep -q tty[1-6] && export TMOUT=900

ulimit -c unlimited

(2). 添加环境变量到单个用户的.bash_profile文件中(对单一用户生效)

要将一个变量添加到单个用户的 .bash_profile 文件中,使其仅对该用户有效并且是“永久的”,可以按照以下步骤进行:

  1. 打开终端并以所需用户的身份登录。

  2. 使用文本编辑器(例如vim)打开 ~/.bash_profile 文件。例如,执行以下命令打开文件:

    1
    2
    bashCopy code
    vim ~/.bash_profile
  3. 在文件末尾添加所需的变量,例如 CLASSPATH。例如:

    1
    2
    javascriptCopy code
    export CLASSPATH=/usr/local/lib

    这将在用户登录时为该用户设置 CLASSPATH 环境变量。

  4. 保存并关闭文件。

现在,新添加的环境变量将仅对该用户生效。注意:修改文件后需要重新登录该用户才能使更改生效。

(3). 直接使用export命令定义环境变量(只对当前shell有效)

要在当前shell(BASH)中定义一个临时的环境变量,可以按照以下步骤进行:

  1. 打开终端并启动所需shell(BASH)。

  2. 在命令行中使用 export 命令定义所需变量。例如:

    1
    2
    javascriptCopy code
    export CLASSPATH=/usr/local/lib

    这将在当前shell中定义 CLASSPATH 环境变量。

  3. 在需要使用该变量的命令中使用该变量。

请注意,当当前shell(BASH)关闭时,该环境变量也将被销毁。要使该变量永久生效,您需要将其添加到适当的配置文件中(如 /etc/profile~/.bash_profile)。

修改和查看环境变量

以下是一些在 Linux 中修改和查看环境变量的常用命令:

  • echo:显示某个环境变量的值。例如,可以通过执行 echo $PATH 命令来查看 $PATH 变量的值。
  • export:设置一个新的环境变量。例如,可以通过执行 export HELLO="hello" 命令来定义一个名为 HELLO 的环境变量并将其值设置为 “hello”。
  • env:显示所有环境变量。执行 env 命令可以列出当前环境中的所有环境变量及其值。
  • set:显示本地定义的 shell 变量。执行 set 命令可以查看当前 shell 中定义的所有变量,包括环境变量和本地变量。
  • unset:清除环境变量。例如,可以通过执行 unset HELLO 命令来清除名为 HELLO 的环境变量。
  • readonly:设置只读环境变量。例如,可以通过执行 readonly HELLO 命令将名为 HELLO 的环境变量设置为只读,以防止其被修改。

Systemd服务环境变量设置

systemd服务创建的dbus服务,提供了一些方法用于设置派生进程的环境变:

  • Service:org.freedesktop.systemd1
  • Path:/org/freedesktop/systemd1
  • Interface:org.freedesktop.systemd1.Manager

这些方法可以用来管理systemd服务以及它们所创建的派生进程的环境变量。

Method Usage
SetEnvironment (Array of [String] arg_0) ↦ () SetEnvironment() may be used to alter the environment block that is passed to all spawned processes. It takes a string array of environment variable assignments. Any previously set environment variables will be overridden.
UnsetEnvironment (Array of [String] arg_0) ↦ () UnsetEnvironment() may be used to unset environment variables. It takes a string array of environment variable names. All variables specified will be unset (if they have been set previously) and no longer be passed to all spawned processes. This method has no effect for variables that were previously not set, but will not fail in that case.
UnsetAndSetEnvironment (Array of [String] arg_0, Array of [String] arg_1) ↦ () UnsetAndSetEnvironment() is a combination of UnsetEnvironment() and SetEnvironment(). It takes two lists. The first list contains variables to unset, the second one contains assignments to set. If a variable is listed in both, the variable is set after this method returns, i.e. the set list overrides the unset list.

注:事实上提供的服务中还允许我们调用接口实现systemctl的一些功能,提供启动或停止服务,对应的接口分别为StartUnit和StopUnit

DBus服务环境变量设置

类似于systemd,dbus的服务中也提供了相应的方法来管理环境变量:
Service:org.freedesktop.DBus
Path:/org/freedesktop/DBus
Interface:org.freedesktop.DBus

Method Usage
UpdateActivationEnvironment (Dict of {String, String} arg_0) ↦ ()

这个服务中提供了许多方法来控制进程环境变量的设置,例如 GetEnvironment() 方法可以获取当前进程的所有环境变量,SetEnv() 方法可以设置指定的环境变量,UnsetEnv() 方法可以取消指定的环境变量等等。通过这些方法,我们可以在DBus服务中方便地设置和管理进程环境变量。

附录

本文资料为以下链接的总结,可能大量借鉴其中内容,仅做分享之用,如有侵权,告知必删。

Linux环境变量总结

什么是环境变量,Linux环境变量及作用

org.freedesktop.systemd1

环境变量

 Comments