如何在 Linux 中设置和列出环境变量
在Linux和基于Unix的系统中,环境变量是一组动态命名值,存储在系统中,由shell或子shell中启动的应用程序使用。简单地说,环境变量是一个有名称和相关值的变量。
环境变量允许你自定义系统的工作方式和系统上应用程序的行为。例如,环境变量可以存储关于默认的文本编辑器或浏览器、可执行文件的路径、或系统区域设置和键盘布局设置的信息。
在本指南中,我们将解释如何读取和设置环境变量和shell变量。
环境变量和Shell变量
变量有以下格式:
KEY=value
KEY="Some other value"
KEY=value1:value2
- 变量的名称是区分大小写的。按照惯例,环境变量的名称应该是大写字母。
- 当给变量分配多个值时,它们必须用冒号
:
字符隔开。 - 在等号
=
的周围没有空格。
变量可以分为两大类,环境变量和shell变量。
环境变量是全系统可用的变量,所有生成的子进程和shell都会继承这些变量。
shell变量是只适用于当前shell实例的变量。每个shell,如zsh
和bash
,都有自己的内部shell变量。
有几个命令可以让你在Linux中列出和设置环境变量:
env
- 该命令允许你在自定义环境中运行另一个程序,而不修改当前环境。在没有参数的情况下使用,它将打印出当前环境变量的列表。printenv
- 该命令打印所有的或指定的环境变量。set
- 该命令设置或取消设置shell变量。当使用时没有参数,它将打印所有变量的列表,包括环境和shell变量,以及shell函数。unset
- 该命令删除了shell和环境变量。export
- 该命令设置了环境变量。
列表中的环境变量
最常用的显示环境变量的命令是printenv
。如果变量的名称作为参数传给了命令,则只显示该变量的值。如果没有指定参数,printenv
会打印出所有环境变量的列表,每行一个变量。
例如,如果要显示HOME
环境变量的值,你可以运行:
printenv HOME
输出将打印出当前登录的用户的路径:
输出
/home/linuxize
你也可以向printenv
命令传递一个以上的参数:
printenv LANG PWD
输出
en_US
/home/linuxize
如果你在没有任何参数的情况下运行printenv
或env
命令,它将显示所有环境变量的列表:
printenv
输出结果将看起来像这样:
输出
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35;...
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=en_US
S_COLORS=auto
XDG_SESSION_ID=5
USER=linuxize
PWD=/home/linuxize
HOME=/home/linuxize
SSH_CLIENT=192.168.121.1 34422 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/linuxize
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LANGUAGE=en_US:
LOGNAME=linuxize
XDG_RUNTIME_DIR=/run/user/1000
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
LESSOPEN=| /usr/bin/lesspipe %s
_=/usr/bin/printenv
下面是一些最常见的环境变量:
USER
- 当前登录的用户。HOME
- 当前用户的主目录。EDITOR
- 要使用的默认文件编辑器。当你在终端键入edit
时,这就是将被使用的编辑器。SHELL
- 当前用户的shell的路径,比如bash或zsh。LOGNAME
- 当前用户的名字。PATH
- 执行命令时要搜索的目录列表。当你运行一个命令时,系统将按照这个顺序搜索这些目录,并使用第一个找到的可执行文件。LANG
- 当前的语言设置。TERM
- 当前的终端仿真度。MAIL
- 当前用户的邮件的存储位置。
printenv
和env
命令只打印环境变量。如果你想获得所有变量的列表,包括环境、shell和变量,以及shell函数,你可以使用set
命令:
set
输出
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
该命令将显示一个所有变量的大列表,所以你可能想用管道将输出的数据输送到less
命令中。
set | less
你也可以使用echo命令来打印一个shell变量。例如,要打印BASH_VERSION
变量的值,你需要运行:
echo $BASH_VERSION
输出
4.4.19(1)-release
设置环境变量
为了更好地说明Shell和环境变量之间的区别,我们将从设置Shell变量开始,然后转向环境变量。
要创建一个名称为MY_VAR
、数值为Linuxize
的新的shell变量,只需键入:
MY_VAR='Linuxize'
你可以通过使用echo $MY_VAR
用grep set | grep MY_VAR
过滤set命令的输出来验证变量是否被设置了:
echo $MY_VAR
输出
Linuxize
使用printenv
命令来检查这个变量是否是环境变量:
printenv MY_VAR
输出结果将是空的,这告诉我们该变量不是环境变量。
你也可以尝试在一个新的shell中打印这个变量,你会得到一个空的输出结果。
bash -c 'echo $MY_VAR'
export
命令是用来设置环境变量的。
要创建一个环境变量,只需将shell变量导出为环境变量:
export MY_VAR
你可以通过运行来检查这一点:
printenv MY_VAR
输出
Linuxize
如果你这次试图在一个新的shell中打印这个变量,你会得到打印在终端机上的变量名称:
bash -c 'echo $MY_VAR'
输出
Linuxize
你也可以在单行中设置环境变量:
export MY_NEW_VAR="My New Var"
以这种方式创建的环境变量只在当前会话中可用。如果你打开一个新的shell或者你注销了,所有的变量都会丢失。
持久性环境变量
为了使环境变量持久化,你需要在bash配置文件中定义这些变量。在大多数Linux发行版中,当你开始一个新的会话时,环境变量会从下列文件中读取:
/etc/environment
- 使用这个文件来设置全系统的环境变量。这个文件中的变量是以下列格式设置的:FOO=bar
VAR_TEST="Test Var"
/etc/profile
- 只要进入bash登录shell,在这个文件中设置的变量就会被加载。在这个文件中声明环境变量时,你需要使用export
命令:export JAVA_HOME="/path/to/java/home"
export PATH=$PATH:$JAVA_HOME/bin
每个用户的shell特定配置文件。例如,如果你使用Bash,你可以在
~/.bashrc
中声明变量:export PATH="$HOME/bin:$PATH"
要把新的环境变量加载到当前的shell会话中,请使用source
命令:
source ~/.bashrc
总结
在本指南中,我们向你展示了如何设置和列出环境变量和shell变量的方法。
如果你有任何问题,请随时留言评论。