6.2 Bash 启动文件(Bash Startup Files)

该部分描述的是 Bash 如何执行其启动文件。如果有任意的启动文件存在但不可读,则 Bash 会报错。关于在文件名中的波浪号扩展的描述可参考 3.5.2《波浪号扩展》部分。

交互式 shell 可参考 6.3《交互式 shell》部分。

Bash 作为交互式登录 shell 调用,或调用时带有“—login”选项

当 Bash 作为一个交互式登录 shell 调用时,或作为带有“—login”选项的非交互式 shell 调用时,如果文件“/etc/profile”存在,其会首先读取该文件并执行其中的命令。在读取了这个文件后,其会按顺序查找“/.bash_profile”、“/.bash_login”和“~/.profile”文件,并且会从找到的第一个存在的、可读的文件中读取命令并且执行。当在 shell 启动时想要禁用该行为,则可以在调用 Bash 时使用“—noprofile”选项。

当一个交互式登录 shell 退出时,或一个非交互式登录 shell 执行到内建命令 exit 时,如果“~/.bash_logout”文件存在,Bash 会读取中的命令并执行。

Bash 作为交互式非登录 shell 调用

当启动了一个非登录的交互式 shell 时,如果“/.bashrc”文件存在的话,Bash 将读取该文件并执行。可以使用“—norc”选项禁止这种行为。“—rcfile file”选项可以强制 Bash 从指定的文件中读取命令并执行,用于代替从默认的文件“/.bashrc”中读取。

所以,一般情况下,你的“~/.bash_profile”文件应该在任何特定登录初始化之后(或之前)包含这一行:

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

Bash 作为非交互式调用

当 Bash 以非交互式启动来运行 shell 脚本,其在环境中查找 BASH_ENV 变量。如果找到,则对其值进行扩展。并且对其扩展出的文件名进行读取和执行。Bash 的行为就像执行了下面的这个命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

但变量 PATH 的值不会用于对该文件名的搜索。

就像上面提到的,如果在调用一个非交互式 shell 时使用了“—logoin”选项,Bash 则会试图从登录 sehll 的启动文件中读取命令并执行。

使用 sh 调用 Bash

如果使用 sh 这个名称调用 Bash 时,其会试图尽可能模仿早期版本的 sh 的启动行为,并与 POSIX 标准保持一致。

当其作为一个交互式登录 shell 调用,或作为一个带有“—logoin”选项的非交互式 shell 调用时,其首先会试图按顺序从“/etc/profile”和“~/.profile”中读取和执行命令。可以使用“—noprofile”选项禁用该行为。当使用 sh 调用一个交互式 shell 时,Bash 会查找 ENV 变量。如果定义了该变量,则会扩展其值,并且会对扩展出的文件名进行读取和执行。一旦以 sh 调用 shell,其不会从其它启动文件中读取执行命令,所以“—rcfile”是不会起作用的。使用 sh 调用一个非交互式 shell 时,不会试图读取任何其它启动文件。

当作为 sh 调用时,Bash 会在读取启动文件文件后进行 POSIX 模式。

调用 Bash 进入 POSIX 模式

当 Bash 使用“—posix”命令行选项启动进入 POSIX 模式时,其会使用 POSIX 标准的启动文件。在这种模式下,交互式 shell 会将 ENV 变量进行扩展,并从所得到的文件读取并执行命令。不会对其它启动文件进行读取。

使用远程 shell 守护进程调用 Bash

当由远程 shell 守护进程,通常为 rshd,或安全 shell 守护进程 sshd 调用 Bash 时,其会试图确定其标准输入会连接到哪个网络连接。如果 Bash 确定了其运行于这种方式,如果文件“~/.bashrc”存在并可读的话,则从该文件读取并执行命令。但如果是使用 sh 调用的 Bash,则不会这样做。“—norc”选项可用于禁用些行为,“—rcfile”选项可用于强制读取其它文件。但 rshd 和 sshd 通常不会在调用 shell 时使用这些选项或指定它们。

调用 Bash 时有效用户(或组)与真实用户(或组)ID 不相等

如果 Bash 在启动时有效用户(或组)ID 与真实用户(或组)ID 不相等,并且没有给出“-p”选项时,则不会读取任何启动文件;不会从环境中继承 shell 函数;如果变量“SHELLOPTS”、“BASHOPTS”、“CDPATH”和“GLOBIGNORE”存在环境中,则忽略它们;并且将有效用户 ID 设置为真实用户 ID。如果在调用时提供了“-p”选项,则具有以上相同的启动行为,但不会对有效用户 ID 进行重置。