系统执行shell脚本时用的就是这种shell。不同的地方在于他没有命令行提示符。但是当你在系统上运行脚本的时,也许希望能够运行一些特定的启动命令。
窍门
脚本能以不同的方式执行。只有其中的某一些方式能够启动子shell。
为了处理这种情况, bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进程时,他会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件里的命令这通常包括shell脚本变量的设置。
CentOS Linux发行版中,这个环境变量在默认情况下并未设置。如果变量未设置,printenv 命令只会返回命令行(CLI)提示符:
$printenv BASH_ENV
$
,
所用Ubuntu发行版中,变量BASH_ENV也没有被设置。记住,如果变量未设置, echo命令会显示一个空行,然后返回**命令行(CLI)**提示符:
$ echo $BASH_ENV
$
- 那如果BASH_ENV变量没有设置,shell脚本到哪里去获得他们的环境变量呢?别忘了有些脚本是通过启动一个子shell来执行的 。子shell可以继承父shell导出过的变量
- 举例来说,如果父shell是登录shell,在/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc文件中设置并导出了变量,用于执行脚本的子shell就能够获得继承这些变量。
- 要记住,由于父shell设置但并未导出的变量都是局部变量。子shell无法继承局部变量。
- 对于那些不启动子shell的脚本,变量已经存在与当前shell中了所以就算没有设置BASH_ENV,也可以使用当前shell的局部变量和全局变量。