
3.6 登录Shell与非登录Shell
某用户登录系统时,根据登录方式的不同,会取得登录Shell或非登录Shell。所谓登录Shell,就是当用户登录系统后,系统会分配给这个用户一个Shell环境,此用户可以在这个Shell环境中运行自己的命令和脚本,完成设置变量等操作;非登录Shell就是当用户再次开启一个其他Shell时(如子Shell),这个Shell会继承父Shell的一些变量或环境。
登录Shell与非登录Shell在读取文件时不同。一般个人环境的配置文件有两类:一类是profile文件;另一类是bashrc文件。前者主要设置环境变量或仅在登录时运行的命令;后者一般用于设置函数、别名等。根据作用范围不同,这两类文件又分为全局级和用户级,见表3-3。
表3-3 profile与bashrc文件

续表

/etc/profile是所有用户登录系统时默认都会读取的文件,在这个文件中定义了一些常见的环境变量,如$PATH、$USR、$HOSTNAME、$HISTSIZE 等。其中有一个功能是使用for循环来迭代运行/etc/profile.d/*.sh文件。

/etc/profile.d目录中是对颜色、语系、which等命令进行的一些附加设置。由于/etc/profile文件是全局生效的,因此设置时要格外小心。
/etc/bashrc文件用于设置别名、函数等,也是全局生效的。例如,设置一个别名“net”。

设置完成后,需要使用“source/etc/bashrc”将设置文件的内容读取到当前的Shell环境中,让文件内容立即生效。


~/.bash_profile和~/.bashrc的作用范围是用户级的,即对某个用户生效。例如,希望用户edward登录系统后,显示当月的日历,同时修改此用户的$PS1变量。为了完成此操作,可以在/home/edward/.bashrc中定义如下内容:

用户edward再次登录系统时,显示如下内容。

当然,该操作也可以在/home/edward/.bash_profile中定义,效果是一样的。
还有两个和用户退出系统有关的文件:~/.bash_logout和~/.bash_history。当用户退出系统时,其历史记录会被保存在bash_history中,而如果把某个任务放入bash_logout文件中,则每次用户退出系统时,都会执行此文件中的任务。例如,在/home/edward/.bash_logout中写入“systemctl reboot-i”命令后,当用户edward退出登录时,系统会自动重启。