待完善

四种类型shell分别会加载哪些环境变量文件?如何通过实验亲自验证?

分类

  • profile类只在用户登录的时候执行一次
  • bashrc类在每次bash被运行的时候加载一次
  • /etc/目录下为系统全局
  • ~/目录下为用户私有
  • 四种组合即为所有的类型:

/etc/profile,/etc/bashrc 是系统全局环境变量设定
~/.profile,~/.bashrc用户家目录下的私有环境变量设定

系统启动+用户登录后的环境变量读取顺序

  1. [system]首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如/etc/profile.d和/etc/inputrc。
  2. [bash]全局:/etc/bashrc
  3. [system]然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系
  4. [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,而不是非登陆式的。