环境变量
在SHELL中,存在两种类型的环境变量,全局环境变量与局部环境变量。全局环境变量是指变量可以在该SHELL、及子SHELL中被引用,而局部环境变量只能在其创建的进程中被引用。系统环境变量默认采用全部大写来标识,建议用户自定义的环境变量采用小写,以免覆盖系统自定义的环境变量。
通过set、env、printenv命令可以查看环境变量的设置,其中env与printenv只能查看系统全局变量,set不仅可以看到局部环境变量,还可以查看自定义的局部环境变量。
通过赋值语句key=value
的方式在SHELL中设置局部环境变量,然后就可以在该进程中的任意地方使用定义的环境变量,但在子shell或者新进程中,该环境变量还是不可见的,必须使用export命令将其导出。
使用export语句定义了全局环境变量后,在子shell中可以使用自定义的全局环境变量,也可以在子shell中修改甚至删除该变量(删除变量使用unset命令),但修改或者删除的作用范围仅限于子shell中,该变化不会反映到父shell中,即使在子shell中重新使用export语句。
PATH环境变量
当在SHELl中输入命令时,系统首先需要找到这些命令对应的执行文件,全局环境变量PATH定义了系统应该在哪些地方找命令,如果在PATH中所有的路径都找不到命令,则系统会报command not found
错误。比较常见的PATH临时修改方式为export PATH="new_path:$PATH"
。
修改配置文件定义环境变量
要永久修改环境变量可以通过修改对应的启动文件,SHELL不同的启动方式,会对应不同的环境变量配置文件。主要启动方式有三种:登录交互式shell会话、非登录交互式shell会话、非登录非交互式shell会话。
登录方式与非登录方式的区别
登录式shell——需要账号密码才能进入的shell,或者通过–login选项。非登录式shell——不需要账号密码就能进入的shell,比如在命令行输入bash
命令会进入一个非登录式shell。
登录式shell与非登录式shell可以通过以下方式区分,第一非登录式只能通过exit退出,而登录式可以通过logout或者exit退出;第二可以用ps -f
命令查看,登录式bash会显示-bash 或者bash --login,而非登录式bash只会显示bash,如下图所示:
交互式与非交互式的区别
交互式——这是比较常见的方式,就是用户输入指令,系统马上处理并返回结果,如此循环,直到用户退出。非交互式——shell script
方式,shell读取脚本文件的全部命令,然后依次执行,执行完成后自动退出shell。
可以通过打印$-
的值来区分是交互式还是非交互式,如果输出中包含i选项(interactive),则是交互式的,否则不是交互式的。
不同shell加载环境变量配置文件的顺序
shell启动时会加载指定的配置文件,这些配置文件又叫做启动文件,当需要永久性修改某些环境变量,就到指定的启动文件中修改,注意后执行的启动文件的配置项会覆盖之前的启动文件的配置项。
登录式SHELL加载顺序:/etc/profile -> /etc/profile.d -> ~/.bash_profile -> ~/.bashrc -> /etc/bachrc
非登录式SHELL加载顺序:~/.bashrc -> /etc/bashrc。 非登录式的shell不会检查/etc/profile文件,只会检查用户主目录下的.bashrc文件。
非交互式SHELl加载顺序:BASH_ENV环境变量。对于非交互式SHELL,系统会先检查BASH_ENV环境变量,如果该变量指定了启动文件,则执行启动文件中的命令。如果BASH_ENV的值为空,当脚本在一个子shell中执行时,执行的脚本会利用从父SHELL那里继承的环境变量; 当脚本在当前SHELL中执行时,则利用当前SHELL中的环境变量。