如何在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/theitroad
我们还可以将多个参数传递给'printenv'命令:
printenv LANG PWD
en_US /home/theitroad
如果我们运行不带任何参数的'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=theitroad PWD=/home/theitroad HOME=/home/theitroad 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/theitroad TERM=xterm-256color SHELL=/bin/bash SHLVL=1 LANGUAGE=en_US: LOGNAME=theitroad 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'-当前的终端仿真。
- “邮件”-当前用户邮件的存储位置。
'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 Variables。
要创建一个名称为“ MY_VAR”且值为“ theitroad”的新shell变量,只需键入:
MY_VAR='theitroad'
我们可以通过使用'echo $MY_VAR'或者grep'set |过滤set命令的输出来验证变量是否已设置。
grep MY_VAR':
echo $MY_VAR
theitroad
使用“ printenv”命令检查此变量是否为环境变量:
printenv MY_VAR
输出将为空,这告诉我们该变量不是环境变量。
我们也可以尝试在子shell程序中打印变量,我们将得到一个空输出。
bash -c 'echo $MY_VAR'
'export'命令用于设置环境变量。
要创建环境变量,只需将shell变量导出为环境变量:
export MY_VAR
我们可以通过运行以下命令进行检查:
printenv MY_VAR
theitroad
如果这次尝试在子shell中打印变量,则会在终端上显示变量名称:
bash -c 'echo $MY_VAR'
theitroad
我们还可以在一行中设置环境变量:
export MY_NEW_VAR="My New Var"
以这种方式创建的环境变量仅在当前会话中可用。
如果打开新的shell程序或者注销,所有变量将丢失。
持久性环境变量
要使环境变量具有持久性,我们需要在bash配置文件中定义这些变量。
在大多数Linux发行版中,当我们开始新的会话时,将从以下文件中读取环境变量:
- '/etc/environment'-使用此文件来设置系统范围的环境变量。该文件中的变量以以下格式设置:
FOO=barVAR_TEST="Test Var"
- '/etc/profile'-每当输入bash登录shell时,都会加载此文件中设置的变量。在此文件中声明环境变量时,我们需要使用“导出”命令:
export JAVA_HOME="/path/to/java/home"export PATH=$PATH:$JAVA_HOME/bin
- 每用户shell程序特定的配置文件。例如,如果我们使用的是Bash,则可以在'~/.bashrc'中声明变量:
export PATH="$HOME/bin:$PATH"
要将新的环境变量加载到当前的shell会话中,请使用“源”命令:
source ~/.bashrc