INVOCATION
Login Shell
指的是第一个命令行参数是`-‘,或者使用了–login选项。
Interactive Shell
是一个没有非可选参数、没有-c选项、其stdin和stderr都连接到终端(由isatty(3)确定),或者由-i选项启动的终端。如果bash是交互式的,会设置PS1、$-包括i,允许shell脚本或启动文件来测试此状态。
以下描述了bash如何执行其启动文件。如果任何文件存在但无法读取,bash将报告错误。文件名中的波浪(~)在EXPANSION部分的Tilde Expansion下会描述。
Login Shell
当以Login Shell登录时,首先读取/etc/profile(如果存在),然后在读取~/.bash_profile,~/.bash_login,~/.profile。按顺序、读取并执行文件中的命令。–noprofile选项用于禁用这种行为。
Login Shell退出时,如果存在的话~/.bash_logout文件,则执行。
Interactive Shell
如果不是Login Shell而是Interactive Shell,bash读取/etc/bash.bashrc,~/.bashrc,并执行其中的命令。使用–norc选项,禁止这种行为。–rcfile file强制bash执行指定的文件,代替默认的/etc/bash.bashrc,~/.bashrc。
Run Commands
当bash以非交互类的形式启动时(比如运行命令),它会查找环境变量中的BASH_ENV的值,并将其值视为要执行的文件。bash的行为如下命令:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
但是PATH环境变量的值,不会用于搜索文件。
SH
如果使用sh调用bash(比如执行bash的软连接,名为sh),那么bash会尽量遵循POSIX标准,尽可能地模拟历史版本的sh的启动行为:
- 当作为Login Shell或具有–login选项的非交互式shell被调用时,它首先尝试以/etc/profile和~/.profile的顺序读取和执行命令。–noprofile选项可能用于抑制此行为。
- 当以名称为sh的交互式shell调用时,bash会查找变量ENV,将其值作为要执行的文件。由于shell调用sh不会尝试从任何其他启动文件读取和执行命令,所以–rcfile选项不起作用。使用名称sh调用的非交互式shell不会尝试读取任何其他启动文件。当作为sh调用时,bash在读取启动文件后进入posix模式。
当bash以posix模式启动时,与–posix命令行选项一样,它遵循POSIX标准。在此模式下,交互式shell读取ENV变量,将其值作为要执行的文件。不会执行其他的启动文件。
Network
通过连接到网络连接的stdin,bash尝试来确定自己是如何被运行的,比如rshd、sshd。如果bash确定是以这种方式运行的,它会从~/.bashrc读取命令并执行(如果这些文件存在且可读)。如果调用sh就不会这样做。–norc选项可能用于禁止此行为,而–rcfile选项可能用于强制读取其他文件,但是rshd和sshd通常都不会使用这些选项来调用shell或允许指定它们。
真实用户组ID及有效用户组ID
如果shell以有效用户(组)id不等于真实用户(组)的id启动,并且没有提供-p选项,则不会读取启动文件,shell函数不会从环境继承,SHELLOPTS ,BASHOPTS,CDPATH和GLOBIGNORE变量(如果它们出现在环境中)将被忽略,有效用户ID会被设置为真实的用户ID。如果在调用时提供-p选项,启动行为是相同的,但是有效的用户ID不会被重置。