shell环境变量
shell
shell分为三类(按启动模式):登录shell,交互式shell,非交互式shell
- 登录shell就是:用户登录时的shell;
- 交互式shell是:在shell里使用bash 调用了shell程序,生成了一个交互式shell,可以用ps查看,exit可以退出当前shell
- 非交互式shell:系统执行shell脚本的时候用的就是非交互式shell
变量
变量有:按作用域分为:全局变量,局部变量;
按属于分为:用户变量(自定义变量,私有变量)和非用户变量;
- 全局变量:相比于局部变量区别是,在shell中创建一个子shell(交互式shell)时全局变量会被拷贝过去;删除(更改)子shell中的
全局变量不会影响到父shell中的变量;
用户自定义变量:
one="is"#这样就定义了一个one变量 默认是局部变量
export one #可以将one变为全局变量
one+="pig" #这样可以更改变量
删除变量:
unset variable_name #删除变量
查看环境变量
env和set
env查看的是所有全局变量(全局变量默认大写),set查看的是的所有变量(用户变量,临时变量最好小写不要覆盖了全局变量);
echo $(variable_name) #对于不可执行变量,可以使用查看
printenv variable_name #查看单个变量
shell启动文件
登录shell 会先执行 /etc/profile -> HOME/.bash_login -> $HOME/.profile
处/etc/profile 文件外后面三个文件若没有就跳过;
其中/etc/profile 只有登录shell会在启动时执行(也就是在用户登录shell时会执行/etc/profile文件)
交互式shell只会找 $HOME/.bashrc 并执行;
注意:登录shell中的.profile 中也可以能有调用.bashrc执行
非交互式shell不会执行上述的哪些个文件;但是当非交互式shell启动时会检查这个 BASH_ENV 变量来查看要执行的启动文件;若有指定文件那么非交互式shell就会执行;BASH_ENV默认没有定义;
持久变量
将变量定于语句写在文件中。
全局变量最好写在/etc/profile.d 中的.sh中*,因为:/etc/profile文件在更新的时候会被换掉,而$HOME/中的文件只能是单个用户使用;/etc/profile.d这个文件夹中的所有文件都会被登录shell执行,(在/etc/profile文件写着的)
用户变量写在$HOME/.bashrc中 因为:交互式shell和登录shell都会执行这个文件,(登录shell执行这个文件是在.profile中调用的)
当然非交互式的变量 还是只能通过BASH_ENV指定一个执行文件来定义;