在基于Linux和Unix的系统中,环境变量是一组动态的命名值,存储在系统内,供在外壳程序或子外壳程序中启动的应用程序使用。简而言之,环境变量是具有名称和关联值的变量。
环境变量使您可以自定义系统的工作方式以及应用程序在系统上的行为。例如,环境变量可以存储有关默认文本编辑器或浏览器,可执行文件的路径或系统区域设置和键盘布局设置的信息。
在本指南中,我们将说明如何读取和设置环境变量和shell变量。
环境变量和外壳变量
变量具有以下格式:
KEY=value
KEY="Some other value"
KEY=value1:value2
复制
- 变量名称区分大小写。按照约定,环境变量应具有大写名称。
- 将多个值分配给变量时,它们必须用冒号分隔:。
- 等号周围没有空格=。
变量可分为两大类,环境变量和外壳变量。
环境变量是在整个系统范围内可用的变量,并由所有衍生的子进程和shell继承。
Shell变量是仅适用于当前Shell实例的变量。每个外壳程序(例如zsh和bash)都有自己的内部外壳程序变量集。
有几个可用的命令可让您在Linux中列出和设置环境变量:
- env–该命令允许您在自定义环境中运行另一个程序,而无需修改当前程序。当不带参数使用时,它将打印当前环境变量的列表。
- printenv –该命令将打印所有或指定的环境变量。
- set–该命令设置或取消设置外壳变量。当不带参数使用时,它将打印所有变量的列表,包括环境和Shell变量以及Shell函数。
- unset –该命令删除外壳程序和环境变量。
- export –该命令设置环境变量。
列出环境变量
用于显示环境变量的最常用命令是printenv。如果将变量名作为参数传递给命令,则仅显示该变量的值。如果未指定任何参数,则printenv输出所有环境变量的列表,每行一个变量。
例如,要显示HOME环境变量的值,请运行:
printenv HOME
输出将显示当前登录用户的路径:
/home/linuxize
您还可以将多个参数传递给printenv命令:
printenv LANG PWD
en_US
/home/linuxize
如果运行不带任何参数的printenvor 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 -当前用户外壳程序的路径,例如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和Environment变量之间的区别,我们将从设置Shell Variables开始,然后继续到Environment变量。
要使用名称MY_VAR和值创建一个新的shell变量,Linuxize只需键入:
MY_VAR='Linuxize'
您可以使用grepecho $MY_VAR过滤set命令的输出来验证是否设置了变量: set | grep MY_VAR
echo $MY_VAR
Linuxize
使用printenv命令检查此变量是否为环境变量:
printenv MY_VAR
输出将为空,这告诉我们该变量不是环境变量。
您也可以尝试在子外壳中打印变量,然后将获得空输出。
bash -c 'echo $MY_VAR'
该export命令用于设置环境变量。
要创建环境变量,只需将shell变量导出为环境变量:
export MY_VAR
您可以通过运行以下命令进行检查:
printenv MY_VAR
Linuxize
如果这次尝试在子外壳中打印变量,则将在终端上显示变量名称:
bash -c 'echo $MY_VAR'
Linuxize
您还可以在一行中设置环境变量:
export MY_NEW_VAR="My New Var"
以这种方式创建的环境变量仅在当前会话中可用。如果打开新的外壳程序或注销,所有变量将丢失。
持久性环境变量
要使环境变量具有持久性,您需要在bash配置文件中定义这些变量。在大多数Linux发行版中,当您开始一个新的会话时,将从以下文件中读取环境变量:
- /etc/environment-使用此文件来设置系统范围的环境变量。此文件中的变量以以下格式设置:
FOO=barVAR_TEST="Test Var"
- /etc/profile-每当输入bash登录shell时,都会加载此文件中设置的变量。在此文件中声明环境变量时,您需要使用以下export命令:
export JAVA_HOME="/path/to/java/home"export PATH=$PATH:$JAVA_HOME/bin
- 每用户外壳程序特定的配置文件。例如,如果您使用的是Bash,则可以在中声明变量~/.bashrc:
export PATH="$HOME/bin:$PATH"
要将新的环境变量加载到当前的shell会话中,请使用以下source命令:
source ~/.bashrc
结论
在本指南中,我们向您展示了如何设置和列出环境变量和shell变量。
如有任何疑问,请随时发表评论。