bash环境变量
环境变量包含有关登录会话的信息,这些信息存储在系统外壳程序中,以在执行命令时使用。 无论您使用的是Linux,Mac还是Windows,它们都存在。 这些变量中有许多是在安装或用户创建时默认设置的。
尽管环境变量适用于所有现代系统,但本文专门介绍了Linux,BSD,Mac和Cygwin上Bash shell中的环境变量。
了解环境变量
从技术上讲,环境变量与变量没有什么不同。 可以使用与变量完全相同的语法来设置,调用和清除它们。 如果您不习惯在Bash中使用变量,请先阅读我在Bash中的变量,然后再继续。
您不经常直接使用环境变量。 根据需要,各个应用程序和守护程序都引用它们。 例如,登录时将主目录设置为环境变量。例如,在Linux上,您可以看到HOME环境变量的内容,如下所示:
$
echo
$HOME
HOME =
/ home
/ seth
在Mac上:
$
echo
$HOME
HOME =
/ Users
/ bogus
在Windows上:
C:\Users\bogus
您可以使用env命令查看系统上设置的所有环境变量。 该列表很长,因此请通过更多管道输出,以使其更易于阅读:
$
env
|
more
TERM =xterm-256color
LESSOPEN =
||/ usr
/ bin
/ lesspipe.sh
% s
USER =seth
SUDO_EDITOR =emacs
WWW_HOME =http:
// mirror.lagoon.nc
/ pub
/ slackware
/ slackware64-current
/ ChangeLog.txt
VISUAL =emacs
DISPLAY =:
0
PS1 =$
XDG_DATA_DIRS =
/ home
/ seth
/ .local
/ share
/ flatpak
/ exports
/ share
/ :
/ var
/ lib
/ flatpak
/ exports
/ share
/ :
/ usr
/ local
/ share
/ :
/ usr
/ share
/
PATH =
/ usr
/ local
/ bin:
/ usr
/ local
/ sbin:
/ usr
/ bin:
/ usr
/ sbin:
/ snap
/ bin:
/ home
/ seth
/ bin:
/ home
/ seth
/ .local
/ bin:
/ snap
/ bin
GDMSESSION =gnome
MAIL =
/ var
/ spool
/ mail
/ seth
[ ...
]
当您要覆盖默认设置,或者需要管理系统没有理由自行创建的新设置时,环境变量可能很有用。 例如,当您键入命令时,计算机知道如何查找与该命令相对应的应用程序的唯一原因是PATH环境变量告诉了它在哪里查找。 此变量列出了用于操作系统搜索命令的有效目录,无论该命令是ls还是cp ,还是Firefox或Lutris之类的图形应用程序,或者其他任何内容。
不同的系统使用了不同的环境变量。 例如,您的PATH变量对于您的终端仿真器至关重要,但是对于Java(具有自己的路径,该路径指向重要的Java库)而言,意义并不大。 但是,多个系统使用USER变量来识别谁在请求服务。 例如,如果您使用的是多用户系统,则需要检查本地邮箱,您的mail命令会根据MAIL和USER变量知道要检索的邮件后台处理程序。
设置环境变量
通常,安装程序(无论是Fedora上的dnf ,Ubuntu上的apt ,Mac上的brew还是自定义安装程序)都会为新应用程序更新环境变量。 但是,有时,当您在发行版预期的工具集之外安装某些软件时,可能必须自己管理环境变量。 或者,您可以选择添加一个环境变量以适合您的首选项。 如果您决定要将某些应用程序保留在主目录中的bin文件夹中,则必须将该目录添加到PATH中,以便您的操作系统在发出命令时可以在其中查找要运行的应用程序。
临时环境变量
您可以使用创建一次性变量的方式在路径中添加位置。 它可以工作,但前提是您用来修改系统路径的外壳保持打开状态。 例如,打开一个Bash shell并修改您的系统路径:
$
export
PATH =
$PATH :
/ home
/ seth
/ bin
确认结果:
$
echo
$PATH
PATH =
/ usr
/ local
/ bin:
/ usr
/ local
/ sbin:
/ usr
/ bin:
/ usr
/ sbin:
/ snap
/ bin:
/ home
/ seth
/ bin:
/ home
/ seth
/ .local
/ bin:
/ snap
/ bin:
/ home
/ seth
/ bin
关闭会话:
$
exit
打开一个新的,看看PATH变量:
$
echo
$PATH
PATH =
/ usr
/ local
/ bin:
/ usr
/ local
/ sbin:
/ usr
/ bin:
/ usr
/ sbin:
/ snap
/ bin:
/ home
/ seth
/ bin:
/ home
/ seth
/ .local
/ bin:
/ snap
/ bin
由于未在每个新Shell中设置PATH,因此该变量已恢复为默认状态。 为此,您必须将变量配置为在启动Shell时加载。
永久环境变量
您可以在shell配置文件中设置自己的持久性环境变量,其中最常见的是〜/ .bashrc 。 如果您是管理多个用户的系统管理员,则还可以在/etc/profile.d目录中的脚本中设置环境变量。
通过配置文件设置变量的语法与在shell中设置变量的语法相同:
export
PATH =
$PATH :
/ snap
/ bin:
/ home
/ seth
/ bin
关闭当前shell,否则强制其加载更新的配置:
$ . ~
/ .bashrc
最后,再看看您的系统路径:
$
echo
$PATH
PATH =
/ usr
/ local
/ bin:
/ usr
/ local
/ sbin:
/ usr
/ bin:
/ usr
/ sbin:
/ snap
/ bin:
/ home
/ seth
/ bin:
/ home
/ seth
/ .local
/ bin:
/ snap
/ bin:
/ home
/ seth
/ bin
现在已正确设置为包括其他自定义目录。
发现其他环境变量
您可以随意创建和操作环境变量,某些应用程序就是这样做的。 这个事实意味着大多数应用程序都不会使用许多环境变量,并且如果您添加自己的任意变量,那么有些根本就不会使用。 所以问题是:如何找出哪些环境变量有意义?
答案在于应用程序的文档。 例如,要了解您在常规Bash环境中可以使用哪些选项,请阅读Bash文档。 尽管Bash手册页提到了许多重要的变量,但Bash的GNU信息页包含两个有用的Bourne Shell和Bash环境变量的详尽列表,以及每个变量的使用方式。
例如,在信息页面列表中:
'HISTCONTROL'
A colon-separated list of values controlling how commands are saved
on the history list. If the list of values includes 'ignorespace',
lines which begin with a space character are not saved in the
history list. A value of 'ignoredups' causes lines which match the
previous history entry to not be saved. A value of 'ignoreboth' is
shorthand for 'ignorespace' and 'ignoredups'.
[...]
此输出告诉您HISTCONTROL环境变量控制如何显示Bash历史记录以及可用于自定义体验的值。 在此示例中, ignoreups值告诉history命令的输出忽略重复的行。
您可以轻松地对此进行测试。 首先,连续两次发出同一命令:
$
echo
"hello world"
hello world
$
echo
"hello world"
hello world
查看您的历史记录,或至少查看最新条目:
$
history
|
tail
-5
996
man
bash
997 info
bash
998
echo
"hello world"
999
echo
"hello world"
1000
history
您可以看到重复的条目确实已经列出。
根据您在信息页面中读取的内容,在.bashrc文件中设置一个新的环境变量:
export
HISTCONTROL =
$HISTCONTROL :ignorespace:ignoredups
保存,然后加载新配置:
$
source ~
/ .bashrc
连续两次发出两个命令:
$
echo
"hello once"
hello once
$
echo
"hello once"
hello once
查看历史记录中的最新条目:
$
history
|
tail
-5
1000
history
1001 emacs ~
/ .bashrc
1002
source ~
/ .bashrc
1003
echo
"hello once"
1004
history
现在,由于您使用了新的环境变量,重复的条目被折叠为一个条目,就像指定的信息页面一样。
查找相关的环境变量通常是阅读要影响的应用程序文档的问题。 大多数环境变量特定于一个应用程序需要平稳运行的条件。 对于一般条目,您的外壳文档是合乎逻辑的地方。 如果编写要求新环境变量的脚本或应用程序,请确保在您自己的文档中定义这些变量。
翻译自: https://opensource.com/article/19/8/what-are-environment-variables
bash环境变量