在基于Linux和Unix的系统中,环境变量是一组动态命名的值,存储在系统中,在shell或子shell启动的应用程序中使用。
简单来说,环境变量是具有名称和关联值的变量。环境变量允许您自定义系统的工作方式以及系统应用程序的行为。
例如,环境变量可以存储默认文本编辑器或默认浏览器的信息,可执行文件的路径或系统区域设置和键盘布局设置。
在本教程中,我们将解释如何读取和设置环境变量。
环境变量和shell变量具有键值对的格式。变量的名称区分大小写。按照惯例,环境变量应该使用大写字符。
为变量分配多个值时,必须用冒号:字符分隔,例如PATH环境变量。 =符号周围没有空格。
变量可以分为两大类,环境变量和shell变量。环境变量是系统范围内可用的变量,由生成的shell子进程继承。
Shell变量是仅适用于当前shell会话的变量。每种shell程序,如zsh和bash,都有自己的一组内部shell变量。
有几个命令可用于在Linux中列出和设置环境变量包括env,printenv,set,unset,export。
env命令允许您在自定义环境变量在当前的shell会话中。在没有参数的情况下使用时,它将打印当前环境变量的列表。
printenv命令打印所有或指定的环境变量。set命令设置或删除shell变量。在没有参数的情况下使用时,它将打印所有变量的列表,包括环境变量和shell变量以及shell函数。
unset命令删除shell和环境变量。export命令设置环境变量。
列出环境变量的最常用命令是printenv。如果将变量的名称作为参数传递给命令,则仅打印该变量的值。
如果未指定参数,printenv打印所有环境变量的列表,每行一个变量。
printenv HOME命令打印HOME的环境变量的值,它将打印输出当前登录用户的路径,也就是用户的家目录。
您还可以向printenv命令传递多个参数,例如命令printenv LANG PWD将会打印语言设置的环境变量和当前目录。
如果没有任何参数运行printenv或者env命令,它将显示所有环境变量的列表。
printenv #打印所有环境变量
printenv HOME #打印HOME 环境变量
printenv LANG PWD #打印多个环境变量
这是一些最常见的环境变量。USER当前登录的用户。HOME当前用户的家目录。EDITOR要使用的默认文本编辑器。这是您在终端中编辑时将要使用的编辑器。
SHELL当前用户shell的路径,例如bash或zsh。LOGNAME当前用户的名称。
PATH是运行命令时要搜索的目录列表。当您运行命令时,系统将按此顺序搜索这些目录并使用第一个找到的可执行文件。
LANG当前的语言环境设置。TERM当前的仿真终端。MAIL存储当前用户邮件的位置。
printenv和env命令只打印环境变量。如果要获取所有变量的列表,包括环境变量和shell变量以及shell函数,可以使用set命令。
set命令不需要任何参数。命令将显示所有变量的列表,因此您可能希望将输出通过管道传递给less命令set | less。
您还可以使用echo命令打印shell变量。例如命令echo $BASH_VERSION打印BASH_VERSION要运行的变量的值。
set #打印环境变量以及shell变量
set | less #分页查看变量
echo $BASH_VERSION #打印shell变量
为了更好地说明Shell和环境变量之间的区别,我们将从设置Shell变量开始,然后转到环境变量。
MY_VAR='myfreax'命令使用名称MY_VAR和值myfreax设置新的shell变量,这其实不是命令,这样shell程序的语法。
您可以使用grep过滤set命令的输出来验证变量是否已设置。命令set | grep MY_VAR将打印MY_VAR变量的值myfreax。
你可使用printenv命令检查此变量是否为环境变量,如果输出为空,告诉我们变量不是环境变量。
您可以尝试在子shell中打印MY_VAR变量,运行命令bash -c 'echo $MY_VAR',您将获得一个空输出。
因为bash -c命令将会启动一个shell会话实例,当前shell会话设置的环境变量不会被子shell会话继承但继承环境变量。
MY_VAR='myfreax'
set | grep MY_VAR
printenv MY_VAR # 打印空字符串
bash -c 'echo $MY_VAR' #在子shell中打印shell变量,打印空字符串
export命令用于设置环境变量。最简单的方式将shell变量导出为环境变量,例如命令export MY_VAR=myfreax,将MY_VAR设置为环境变量。
命令printenv MY_VAR打印环境变量MY_VAR的值,它将打印myfreax。如果您尝试在子shell中打印环境变量,子shell将会继承父shell进程的环境变量。
bash -c 'echo $MY_VAR'命令启动子shell会话,然后使用echo打印MY_VAR环境变量此时您将在终端上打印变量的值myfreax。
您还可以在一行中设置环境变量,例如命令export MY_NEW_VAR="My New Var"。
以这种方式创建的环境变量仅在当前会话中可用。如果您打开一个新的shell会话或者您注销当前的登录,则所有变量都将丢失。
export MY_VARR=myfreax
printenv MY_VAR #myfreax
bash -c 'echo $MY_VAR' #在子shell中打印环境变量,打印空字符串R=myfreax
要使环境变量持久化,您需要在bash配置文件中定义这些变量。在大多数Linux发行版中,当您启动新会话时,将从以下文件中读取环境变量。
/etc/environment使用此文件设置系统范围的环境变量。此文件中的变量使用FOO=bar"格式设置环境变量。
/etc/profile只要输入bash登录shell,就会加载此文件中设置的变量。在此文件中声明环境变量,需要使用export命令设置环境变量。
每个用户shell都有指定的配置文件。例如,如果您使用Bash,则可以在~/.bashrc文件声明变量。
~/.bashrc是一个shell脚本,因此设置环境变量时,你需要使用export 命令,例如export PATH="$HOME/bin:$PATH"修改PATH环境变量。
要将新环境变量加载到当前shell会话中,请使用source命令。source ~/.bashrc命令将会加载~/.bashrc声明的变量,source可以是任何文件。
在本指南中,我们向您展示了如何设置和列出环境和shell变量。