Linux和Unix的系统中,环境变量是一组动态命名值,存储在系统中,供在Shell或子Shell中启动的应用程序使用。简而言之,环境变量是具有名称和关联值的变量。
环境变量使您可以自定义系统的工作方式以及系统上应用程序的行为。例如,环境变量可以存储有关默认文本编辑器或浏览器,可执行文件的路径或系统区域设置和键盘布局设置的信息。
接下来我们将说明如何读取和设置环境变量和shell变量。
环境变量和Shell变量
变量具有以下格式:
<code>KEY
=valueKEY
="Some other value"
KEY
=value1:value2/<code>
有以下几点需要注意:
变量可分为两大类,环境变量和shell变量。
环境变量是在整个系统范围内可用的变量,并由所有衍生的子进程和shell程序继承。
Shell变量是仅适用于当前Shell实例的变量。每个shell程序(例如zsh和bash)都有自己的内部shell程序变量集。
在linux中,有几个命令,可以列出和设置环境变量:
列出环境变量
用于显示环境变量的最常用命令是printenv。如果将变量名作为参数传递给命令,则仅显示该变量的值。如果未指定任何参数,则printenv输出所有环境变量的列表,每行一个变量。
例如,要显示HOME环境变量的值,可以运行:
<code>printenv
HOME/<code>
上面命令输出将显示当前登录用户的路径:
<code>/home/linuxize/<code>
您还可以将多个参数传递给printenv命令:
<code>printenv
LANG PWD/<code>
<code>en_US
/home/linuxize/<code>
如果运行不带任何参数的printenvor env命令,它将显示所有环境变量的列表:
<code>printenv/<code>
输出将如下所示:
<code>LS_COLORS
=rs=0
:di=01
LESSCLOSE
=/usr/bin/lesspipe %s %sLANG
=en_USS_COLORS
=autoXDG_SESSION_ID
=5
USER
=linuxizePWD
=/home/linuxizeHOME
=/home/linuxizeSSH_CLIENT
=192.168
.121.1
34422
22
XDG_DATA_DIRS
=/usr/local/share:/usr/share:/var/lib/snapd/desktopSSH_TTY
=/dev/pts/0
TERM
=xterm-256
colorSHELL
=/bin/bashSHLVL
=1
LANGUAGE
=en_US:LOGNAME
=linuxizeXDG_RUNTIME_DIR
=/run/user/1000
PATH
=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binLESSOPEN
=| /usr/bin/lesspipe %s_
=/usr/bin/printenv/<code>
以下是一些最常见的环境变量:
该printenv和env命令只打印环境变量。如果要获取所有变量的列表,包括环境,shell和变量以及shell函数,则可以使用以下set命令:
<code>set
/<code>
<code>BASH
=/bin/bashBASHOPTS
=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES
=()BASH_ARGC
=()BASH_ARGV
=()/<code>
该命令将显示所有变量的较大列表,你可以使用LESS参数
<code>set
|less
/<code>
也可以使用echo命令来打印shell变量。例如,要打印BASH_VERSION变量的值,可以运行:
<code>echo
$BASH_VERSION
/<code>
以上命令将输出:
<code>4.4
.19
(1)-release
/<code>
设置环境变量
为了更好地说明Shell和Environment变量之间的区别,我们将从设置Shell Variables开始,然后继续到Environment变量。
假设我们要创建 一个新的shell变量,名称为MY_VAR,值为Linuxize
可以使用命令:
<code>MY_VAR
='Linuxize'
/<code>
接下来,我们可以使用grep echo $MY_VAR来过滤set命令的输出来验证是否设置了变量:
<code>set
| grep MY_VAR/<code>
将输出:
<code>Linuxize/<code>
使用printenv命令检查此变量是否为环境变量:
<code>printenv
MY_VAR/<code>
输出将为空,说明该变量不是环境变量。
我们尝试在shell程序中打印变量,将得到一个空输出
<code>bash
-c'echo
$MY_VAR
'/<code>
接下来,我们使用 export命令将shell变量导出为环境变量
<code>export
MY_VAR/<code>
然后我们用printenv检查:
<code>printenv
MY_VAR/<code>
将输出
<code>Linuxize/<code>
这次尝试在shell中打印变量,则会在终端上显示变量名称
<code>bash
-c'echo
$MY_VAR
'/<code>
还可以在一行命令中设置环境变量:
<code>export
MY_NEW_VAR="My New Var"
/<code>
注意 以这种方式创建的环境变量仅在当前会话中可用。如果打开新的shell程序或注销,所有变量将丢失。
持久性环境变量
要使环境变量具有持久性,您需要在bash配置文件中定义这些变量。在大多数Linux发行版中,当您启动新会话时,将从以下文件中读取环境变量:
- /etc/environment -使用此文件来设置系统范围的环境变量。此文件中的变量以以下格式设置:
<code>FOO
=barVAR_TEST="Test Var"
/<code>
2./etc/profile-每当输入bash登录shell时,都会加载此文件中设置的变量。在此文件中声明环境变量时,您需要使用以下export命令:
<code>export
JAVA_HOME="/path/to/java/home"
export
PATH=$PATH
:$JAVA_HOME
/bin/<code>
3.shell程序特定的配置文件。例如,如果您使用的是Bash,则可以在中声明变量~/.bashrc:
<code>export
PATH="
$HOME
/bin:$PATH
"/<code>
要将新的环境变量加载到当前的shell会话中,请使用以下source命令:
<code>source
~/.bashrc/<code>
如你喜欢以上内容,可以关注微信公众号:Robert的书签