shell的分类及相应的环境变量总结
待完善[TBC]
四种类型shell分别会加载哪些环境变量文件?如何通过实验亲自验证?
分类
- profile类只在用户登录的时候执行一次
- bashrc类在每次bash被运行的时候加载一次
- /etc/目录下为系统全局
- ~/目录下为用户私有
- 四种组合即为所有的类型:
/etc/profile,/etc/bashrc 是系统全局环境变量设定
~/.profile,~/.bashrc用户家目录下的私有环境变量设定
系统启动+用户登录后的环境变量读取顺序
-
[system]首先读入的是全局环境变量设定档
/etc/profile
,然后根据其内容读取额外的设定的文档,如/etc/profile.d和/etc/inputrc。 -
[bash]全局:
/etc/bashrc
-
[system]然后根据不同使用者帐号,去其家目录读取
~/.bash_profile
,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系 -
[bash]然后再根据用户帐号读取
~/.bashrc
(至于~/.profile与~/.bashrc的区别:都具有个性化定制功能~/.profile可以设定本用户专有的路径,环境变量等,它只能登入的时候执行一次
~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次)
交互式/非交互式|登录/非登录式
以下内容翻译自stackexchange
当你为了获取交互式的环境而登录时,登录式shell是以你的user id执行的第一个进程。通过传递参数0(通常是-bash),登录过程告诉shell以登录式shell的形式出现。登录式shell通常读取的环境变量文件为/etc/profile和~/.profile。
登录交互式
最常见的登录系统后进行操作使用的shell(直接通过终端输入账号密码登录)
当你在文本控制台登录,或通过su -
登录时,你得到的是一个交互登录式shell
。但特殊情况是,当你以图形模式或在X display manager上登录时,你得到的不再是一个登录式shell,而是一个session manager或者window manager。
非登录非交互式
常见的shell脚本的运行方式。
当在一个shell里运行一段脚本或者一个命令时,这里得到的是一个非交互非登录式
shell。这种shell非常常见:就是一个程序运行另一个程序的时候。此时会读入BASH_ENV
环境变量
非登录交互式
在shell中使用bash调出shell、在系统中打开命令行工具等。
当你在一个shell里再开一个shell时(包括screen,X terminal,emacs等),你得到的是一个交互非登录式
shell。新开的shell会读取旧shell的环境变量(~/.bashrc)
登录非交互式
强制使用登录方式打开的shell脚本。可以改变脚本访问的全局文件,在不少情况下也需要使用(远程使用非登录shell调用脚本但需要登录的全局环境时适用)。
非交互登录式shell
比较少见,但是当你用图形式登录时,一些X中的设置会让你得到这种shell。另外,使用ssh example.com my-script-stored-locally
也会得到这种shell(不同于ssh example my-script-strord-remotely
)
扩展操作
echo $0
结果-bash为login型,结果为bash为非登陆型shell- 以非交互登录式运行bash:
echo $- | bash -lx
- 在osx打开终端得到的是交互登陆式shell,而不是非登陆式的。
参考
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。