环境变量
环境变量是一个有名称的对象,包含可被其它程序使用的数据。简单的说,它是一个名称和数值对。环境变量的值可以是文件系统上所有执行程序的位置,默认的编辑器,系统本地化设置等。Linux 新用户可能觉得这种管理变量的方式有点混乱。但是环境变量提供了一种在多个程序和进程间共享配置的方式。
工具
coreutils软件包含程序printenv和env. 要显示当前环境变量的值:
$ printenv
工具 env
可以用指定的环境变量执行一个命令。下面例子把环境变量 EDITOR
设置为 vim
然后执行命令 xterm. 这个操作不会影响全局环境变量EDITOR
.
$ env EDITOR=vim xterm
Bash 内建的 set 命令可以设置 shell 选项值或显示 shell 变量的名称和数值。更多信息请参阅: [1].
每个进程都把他们的环境变量保存在 /proc/$PID/environ
文件中。此文件包含用 nul (\x0
) 字符分隔的键值对。用 sed 可以获得用户可读的内容:sed 's:\x0:\n:g' /proc/$PID/environ
.
定义变量
全局
理论上,任何 shell 脚本都可以初始化环境变量,但为了维护方便,环境变量的定义集中在几个特定的文件中。对全局变量来说是:/etc/profile
, /etc/bash.bashrc
和 /etc/environment
. 每个文件都有不同的限制,请根据需要选择要使用的文件。
/etc/profile
仅初始化登陆 shell 的环境变量。它可以执行脚本并支持 Bash 兼容 Shell。/etc/bash.bashrc
仅初始化交互 shell,它也可以执行脚本但是只支持 Bash。/etc/environment
被 PAM-env 模块使用,和登陆与否,交互与否,Bash与否无关,所以无法使用脚本或通配符展开。仅接受variable=value
格式。
以将 ~/bin
加入某些特定用户的 PATH
为例,可以将其放入 /etc/profile
或 /etc/bash.bashrc
:
# If user ID is greater than or equal to 1000 & if ~/bin exists and is a directory & if ~/bin is not already in your $PATH # then export ~/bin to your $PATH. if [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin) ]] then export PATH=$HOME/bin:${PATH} fi
按用户
有时并不希望定义全局环境变量,比如要把 /home/my_user/bin
加入 PATH
变量但是不影响其它用户。本地环境变量可以在下面文件定义:
- shell 配置文件,例如 Bash#Configuration files 或 Zsh#Startup/Shutdown files.
- 很多 shell 会使用
~/.profile
作为后备方案参考 wikipedia:Unix shell#Configuration files. ~/.pam_environment
是用户特有的环境变量,PAM-env 模块会使用它。参考pam_env(8)
和pam_env.conf(5)
。
要修改本地用户的路径变量,修改 ~/.bash_profile
:
export PATH="${PATH}:/home/my_user/bin"
要更新变量,重新登录或 source 文件 $ source ~/.bash_profile
.
图形程序
要设置图形程序的环境变量,可以将变量放入 xinitrc (从 显示管理器 登陆时,使用 xprofile),例如:
~/.xinitrc
export PATH="${PATH}:~/scripts" export GUIVAR=value
按会话
如果需要更严格的定义,例如在运行程序时临时修改路径,在短时间改变 ~/.bash_profile
等。这时,可以用 export 命令在当前会话修改 PATH
,只要不退出登录,PATH
变量就会一直生效。增加 PATH
到一个会话:
$ export PATH="${PATH}:/home/my_user/tmp/usr/bin"