bash shell 环境变量

全局变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。Linux系统在你开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。

要查看全局变量,可以使用printenv命令。

$ printenv
HOSTNAME=server01.class.edu
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
[...]
$ printenv HOME
/home/Christine

也可以使用echo显示变量值, 必须在变量前面加上一个美元符($)。在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。

$ echo $HOME
/home/Christine
$ ls $HOME
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos
$ ls /home/Christine
Desktop Downloads Music Public test.sh
Documents junk.dat Pictures Templates Videos
  • 设置全局环境变量

 先创建一个局部环境变量,然后再把它导出到全局环境中。这个过程通过export命令来完成,变量名前面不需要加$。

修改子shell中全局环境变量并不会影响到父shell中该变量的值。子shell甚至无法使用export命令改变父shell中全局环境变量的值。

$ my_variable="I am Global now"
$ export my_variable
$ echo $my_variable
I am Global now
$ bash
$ echo $my_variable
I am Global now
$ exit
exit
$ echo $my_variable
I am Global now

局部变量

局部环境变量只能在定义它们的进程中可见,set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

  • 设置局部用户定义变量

可以通过等号给环境变量赋值,值可以是数值或字符串。变量名、等号和值之间没有空格,如果在赋值表达式中加上了空格,bash shell就会把值当成一个单独的命令:

$ echo $my_variable
$ my_variable=Hello
$ echo $my_variable
Hello

设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,如果生成了另外一个shell,它在子shell中就不可用。

$ my_variable="Hello World"
$ bash
$ echo $my_variable
$ exit
exit
$ echo $my_variable
Hello World

删除环境变量

用unset命令删除已经存在的环境变量。在unset命令中引用环境变量时,记住不要使用$。在子shell中删除全局变量后,你无法将效果反映到父shell中

$ echo $my_variable
I am Global now
$ unset my_variable
$ echo $my_variable

设置PATH 环境变量

当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应的程序。PATH环境变量定义了用于进行命令和程序查找的目录。下面输出中显示了有8个可供shell用来查找命令和程序。PATH中的目录使用冒号分隔。

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/linlinle/.local/bin:/home/linlinle/bin
$ PATH=$PATH:/home/linlinle/file1
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/linlinle/.local/bin:/home/linlinle/bin:/home/linlinle/file1

将目录加到PATH环境变量之后,你现在就可以在虚拟目录结构中的任何位置执行程序。通常将单点符也加入PATH环境变量。该单点符代表当前目录。对PATH变量的修改只能持续到退出或重启系统

扫描二维码关注公众号,回复: 4270622 查看本文章

定位系统环境变量

在你登入Linux系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫作启动文件或环境文件。bash检查的启动文件取决于你启动bash shell的方式。启动bash shell有3种方式:

  • 登录时作为默认登录shell
  • 作为非登录shell的交互式shell
  • 作为运行脚本的非交互shell

下面几节介绍了bash shell在不同的方式下启动文件。

  • 登录shell

当你登录Linux系统时,bash shell会作为登录shell启动。登录shell会从5个不同的启动文件里读取命令:

/etc/profile

$HOME/.bash_profile

$HOME/.bashrc

$HOME/.bash_login

$HOME/.profile

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都会执行这个启动文件。

另外4个启动文件是针对用户的都起着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环
境变量。它们位于用户的HOME目录下,所以每个用户都可以编辑这些文件并添加自己的环境变量,这些环境变量会在每次启动bash shell会话时生效。

shell会按照按照下列顺序,运行第一个被找到的文件,余下的则被忽略:

  1. $HOME/.bash_profile
  2. $HOME/.bash_login
  3. $HOME/.profile

.bash_profile启动文件会先去检查HOME目录中是不是还有一个叫.bashrc的启动文件。如果有的话,会先执行启动文件里面的命令。

  • 交互式shell 进程

如果你的bash shell不是登录系统时启动的(比如是在命令行提示符下敲入bash时启动),那么你启动的shell叫作交互式shell。交互式shell不会像登录shell一样运行,但它依然提供了命令行提示符来输入命令。

如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录中的.bashrc文件。

  • 非交互式shell

系统执行shell脚本时用的就是非交互式shell。不同的地方在于它没有命令行提示符。但是当你在系统上运行脚本时,也许希望能够运行一些特定启动的命令。

当shell启动一个非交互式shell进程时,它会检查BASH_ENV环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令,这通常包括shell脚本变量设置。

$ printenv BASH_ENV
$ echo $BASH_ENV
$

这个环境变量在默认情况下并未设置,shell脚本到哪里去获得它们的环境变量呢?假如shell脚本是通过启动一个子shell来执行的,子shell可以继承父shell导出过的变量。举例来说,如果父shell是登录shell,在/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc文件中设置并导出了变量,用于执行脚本的子shell就能够继承这些变量。

  • 环境变量持久化

在大多数发行版中,存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程。但如果设置了BASH_ENV变量,那么记住,除非它指向的是$HOME/.bashrc,否则你应该将非交互式shell的用户变量放在别的地方。

例如alias命令设置就是不能持久的。你可以把自己的alias设置放在$HOME/.bashrc启动文件中,使其效果永久化。

数组变量

环境变量有一个很酷的特性就是,它们可作为数组使用。数组是能够存储多个值的变量。这些值可以单独引用,也可以作为整个数组来引用。要给某个环境变量设置多个值,可以把值放在括号里,值与值之间用空格分隔。

$ mytest=(one two three four five)
$ echo $mytest
one
$ echo ${mytest[2]}
three
$ echo ${mytest[*]}
one two three four five
$ mytest[2]=seven
$ echo ${mytest[*]}
one two seven four five
$ unset mytest
$ echo ${mytest[*]}
$

猜你喜欢

转载自blog.csdn.net/linshuo1994/article/details/83993201