在基于 Linux 的系统中,您可以将动态命名值设置为环境变量。这些值存储在系统中并由命令行应用程序使用。简而言之,环境变量是一个具有名称和关联值的变量。变量是表示值的符号、字母或单词,例如“x”或“y”。
环境变量可以存储有关默认文本编辑器或浏览器的信息、可执行文件的路径等...
环境变量在程序及其子程序中是全局可用的。shell 变量仅在当前 shell 中可用。
在本教程中,我们将解释如何列出和设置环境和 shell 变量。
环境变量
环境变量是系统范围内可用的变量,由所有衍生的子进程和 shell 继承。
环境变量被实现为表示键值对的字符串。如果传递了多个值,它们通常用冒号 (:) 字符分隔。每对通常看起来像这样:
KEY=value1:value2:value3
变量的名称区分大小写,通常以大写格式使用(MYVAR1、MYVAR2...)
如果值包含空格,则使用引号:
KEY="value with spaces"
shell变量
Shell 变量是专门包含在设置或定义它们的 shell 中的变量。每个 shell(例如 zsh 和 bash)都有自己的一组内部 shell 变量。它们通常用于跟踪临时数据,例如当前工作目录。用法与全局环境变量相同。
要使 shell 变量可用作环境变量,请使用 export MYVAR:
$ export MYVAR=kylin.com
$ echo $MYVAR
kylin.com
$ env | grep MYVAR
MYVAR=kylin.com
常见的环境变量和 Shell 变量
一些环境变量和 shell 变量非常有用,并且经常被引用。以下是您会遇到的一些常见环境变量:
TERM | 这指定了在运行 shell 时要模拟的终端类型。针对不同的操作需求,可以模拟不同的硬件终端。不过,您通常不需要担心这一点。 |
USER | 当前登录的用户。 |
PWD | 当前工作目录。 |
OLDPWD | 以前的工作目录。这是由 shell 保存的,以便通过运行 cd - 切换回之前的目录。 |
LS_COLORS | 这定义了用于选择性地将彩色输出添加到 ls 命令的颜色代码。这用于区分不同的文件类型并一目了然地向用户提供更多信息。 |
当前用户邮箱的路径。 | |
PATH | 系统在查找命令时将检查的目录列表。当用户键入命令时,系统将按此顺序检查目录中的可执行文件。 |
LANG | 当前语言和本地化设置,包括字符编码。 |
HOME | 当前用户的主目录。 |
_ | 最近执行的命令。 |
除了这些环境变量之外,您会经常看到的一些 shell 变量是:
BASHOPTS | 执行 bash 时使用的选项列表。这对于确定 shell 环境是否会按照您希望的方式运行很有用。 |
BASH_VERSION | 正在执行的 bash 版本,以人类可读的形式。 |
BASH_VERSINFO | bash 的版本,在机器可读的输出中。 |
COLUMNS | 用于在屏幕上绘制输出的列宽数。 |
DIRSTACK | pushd 和 popd 命令可用的目录堆栈。 |
HISTFILESIZE | 存储到文件中的命令历史记录行数。 |
HISTSIZE | 内存中允许的命令历史记录行数。 |
HOSTNAME | 此时计算机的主机名。 |
IFS | 用于分隔命令行输入的内部字段分隔符。默认情况下,这是一个空格。 |
PS1 | 主要命令提示符定义。这用于定义启动 shell 会话时提示的外观。PS2 用于声明命令跨多行时的辅助提示。 |
SHELLOPTS | 可以使用 set 选项设置的 Shell 选项。 |
UID | 当前用户的 UID。 |
列出 Shell 和环境变量
有几个可用的命令可让您列出 Linux 中的环境变量:
env - 该命令允许您在自定义环境中运行另一个程序,而无需修改当前程序。当不带参数使用时,它将打印当前环境变量的列表。
printenv – 该命令打印所有或指定的环境变量。
set – 该命令设置或取消设置 shell 变量。当不带参数使用时,它将打印所有变量的列表,包括环境和 shell 变量以及 shell 函数。
在默认状态下, env 和 printenv 的功能应该完全相同:
$ printenv
SSH_CONNECTION=10.0.2.2 37182 10.0.2.15 22
LESSCLOSE=/usr/bin/lesspipe %s %s
LANG=C.UTF-8
XDG_SESSION_ID=5
USER=vagrant
MYVAR=kylin.com
PWD=/home/vagrant
HOME=/home/vagrant
SSH_CLIENT=10.0.2.2 37182 22
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
SSH_TTY=/dev/pts/0
MAIL=/var/mail/vagrant
TERM=xterm-256color
SHELL=/bin/bash
SHLVL=1
LOGNAME=vagrant
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
env 和 'printenv' 命令之间的区别仅在它们更具体的功能上很明显。例如,使用“printenv”,您可以请求单个变量的值:
$ printenv SHELL
/bin/bash
$ printenv HOME
/home/vagrant
$ printenv MYVAR
kylin.com
env 命令允许您通过将一组变量传递给命令来修改程序运行的环境:
env MYVAR=kylin.com command_to_run command_options
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=()
BASH_CMDS=()
BASH_COMPLETION_VERSINFO=([0]="2" [1]="8")
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="20" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
BASH_VERSION='4.4.20(1)-release'
COLUMNS=140
DIRSTACK=()
EUID=1000
GROUPS=()
HISTCONTROL=ignoreboth
HISTFILE=/home/vagrant/.bash_history
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/vagrant
HOSTNAME=ubuntu-bionic
HOSTTYPE=x86_64
IFS=
该命令将显示所有变量的大列表,因此您可能希望将输出通过管道传递给 less 命令。
set | less
设置 Shell 和环境变量
可用于在 Linux 中设置环境变量的命令有:
set – 该命令设置或取消设置 shell 变量。当不带参数使用时,它将打印所有变量的列表,包括环境和 shell 变量以及 shell 函数。
unset – 该命令删除 shell 和环境变量。
export – 该命令设置环境变量。
为了更好地理解 shell 和环境变量之间的区别,我们将从设置 shell 变量开始,然后转到环境变量。
我们将从在当前会话中定义一个 shell 变量开始。您可以使用 echo $MYVAR 验证是否设置了变量
$ MYVAR=kylin
$ echo $MYVAR
kylin
使用 printenv 命令检查此变量是否为环境变量:
$ printenv MYVAR
不应返回任何输出。这意味着 MYVAR 变量不是环境变量。
export 命令用于设置环境变量。
要创建环境变量,只需将 shell 变量导出为环境变量:
$ export MYVAR
您可以通过运行检查这一点:
$ printenv MYVAR
kylin
您还可以在一行中设置环境变量:
$ export MYNEWVAR="My New Variable"
以这种方式创建的环境变量仅适用于当前会话。如果您打开一个新的 shell,或者如果您注销,所有变量都将丢失。
我们还可以将环境变量恢复为 shell 变量,甚至完全(取消设置)删除它:
我们的 MYVAR 变量被定义为环境变量。我们可以通过键入以下命令将其更改回 shell 变量:
$ export -n MYVAR
它不再是环境变量,但是,它仍然是 shell 变量。
如果我们想完全取消设置变量,无论是 shell 还是环境变量,我们可以使用 unset 命令来完成:
$ unset MYVAR
我们可以验证它不再设置:
$ echo $MYVAR
没有返回任何内容,因为变量未设置。
持久环境变量
我们已经提到许多程序使用环境变量来决定如何操作的细节。我们不想在每次启动新的 shell 会话时都设置重要的变量,
bash shell 会根据会话的启动方式读取不同的配置文件。
交互式 shell 会话是附加到终端的 shell 会话。非交互式 shell 会话是不附加到终端会话的。
不同会话之间的一个区别是SHELL是作为“登录”会话还是“非登录”会话生成的。
在大多数 Linux 发行版中,当您启动新会话时,会从以下文件中读取环境变量:
/etc/environment - 使用此文件设置系统范围的环境变量。
/etc/profile - 每当输入 bash 登录 shell 时,都会加载此文件中设置的变量。
~/.bashrc - 每用户 shell 特定的配置文件。例如,如果您使用 Bash,则可以在此处声明变量。
要将新环境变量加载到当前 shell 会话中,请使用 source 命令:
$ source ~/.bashrc
如果您需要设置系统范围的变量,您可能需要考虑将它们添加到/etc/profile、/etc/bash.bashrc或/etc/environment。
结论
在本教程中,我们学习了如何设置和列出环境和 shell 变量。这些变量始终存在于您的 shell 会话中,并且对许多程序非常有用。还有许多其他更普通但更常见的场景,您需要读取或更改系统环境。如果您有任何问题,请随时在下面的评论中留下。
\t\n' LANG=C.UTF-8 LESSCLOSE='/usr/bin/lesspipe %s %s' LESSOPEN='| /usr/bin/lesspipe %s' LINES=35 LOGNAME=vagrant .....
该命令将显示所有变量的大列表,因此您可能希望将输出通过管道传递给 less 命令。
设置 Shell 和环境变量
可用于在 Linux 中设置环境变量的命令有:
set – 该命令设置或取消设置 shell 变量。当不带参数使用时,它将打印所有变量的列表,包括环境和 shell 变量以及 shell 函数。
unset – 该命令删除 shell 和环境变量。
export – 该命令设置环境变量。
为了更好地理解 shell 和环境变量之间的区别,我们将从设置 shell 变量开始,然后转到环境变量。
我们将从在当前会话中定义一个 shell 变量开始。您可以使用 echo $MYVAR 验证是否设置了变量
使用 printenv 命令检查此变量是否为环境变量:
不应返回任何输出。这意味着 MYVAR 变量不是环境变量。
export 命令用于设置环境变量。
要创建环境变量,只需将 shell 变量导出为环境变量:
您可以通过运行检查这一点:
您还可以在一行中设置环境变量:
以这种方式创建的环境变量仅适用于当前会话。如果您打开一个新的 shell,或者如果您注销,所有变量都将丢失。
我们还可以将环境变量恢复为 shell 变量,甚至完全(取消设置)删除它:
我们的 MYVAR 变量被定义为环境变量。我们可以通过键入以下命令将其更改回 shell 变量:
它不再是环境变量,但是,它仍然是 shell 变量。
如果我们想完全取消设置变量,无论是 shell 还是环境变量,我们可以使用 unset 命令来完成:
我们可以验证它不再设置:
没有返回任何内容,因为变量未设置。
持久环境变量
我们已经提到许多程序使用环境变量来决定如何操作的细节。我们不想在每次启动新的 shell 会话时都设置重要的变量,
bash shell 会根据会话的启动方式读取不同的配置文件。
交互式 shell 会话是附加到终端的 shell 会话。非交互式 shell 会话是不附加到终端会话的。
不同会话之间的一个区别是SHELL是作为“登录”会话还是“非登录”会话生成的。
在大多数 Linux 发行版中,当您启动新会话时,会从以下文件中读取环境变量:
/etc/environment - 使用此文件设置系统范围的环境变量。
/etc/profile - 每当输入 bash 登录 shell 时,都会加载此文件中设置的变量。
~/.bashrc - 每用户 shell 特定的配置文件。例如,如果您使用 Bash,则可以在此处声明变量。
要将新环境变量加载到当前 shell 会话中,请使用 source 命令:
如果您需要设置系统范围的变量,您可能需要考虑将它们添加到/etc/profile、/etc/bash.bashrc或/etc/environment。