6.2 Bash的启动文件

评论 0 浏览 0 2023-01-26

这一节描述了Bash是如何执行其启动文件的。 如果有任何文件存在但不能被读取,Bash会报告一个错误。 波浪号在文件名中被扩展,如上文波浪号扩展中所述(见2 波浪号扩展)。

交互式shell在6.3 交互式shell中进行了描述。

作为交互式登录shell调用,或用--login进行调用

当 Bash 作为交互式登录 shell 或作为带有 --login 选项的非交互式 shell调用时,它首先从文件/etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会依次查找 ~/.bash_profile~/.bash_login~/.profile,然后从第一个存在且可读的文件开始读取和执行命令。启动 shell 时可以使用--noprofile选项来抑制此行为。

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

作为一个交互式的非登录shell被调用

当启动非登录 shell 的交互式 shell 时,Bash会从~/.bashrc中读取并执行命令(如果该文件存在)。 这可以通过使用--norc选项来禁止。 --rcfile file选项将强制Bash从file中读取和执行命令,而不是从~/.bashrc

所以,通常情况下,你的~/.bash_profile中包含有一行

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

在任何特定的登录初始化之后(或之前),都可以使用。

非交互式调用

当Bash被非交互式地启动时, 例如为了运行一个shell脚本, 它在环境中寻找变量BASH_ENV,如果它出现就扩展它的值,并使用扩展后的值作为文件名来读取和执行。Bash的行为就像执行下面的命令一样。

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

PATH变量的值不会被用来搜索文件名。

如上所述,如果用--login选项调用一个非交互式shell,Bash会尝试从login shell的启动文件中读取和执行命令。

sh调用

如果Bash以sh的名字被调用,它就会尽可能地模仿sh的历史版本的启动行为,同时也符合POSIX的标准。

当作为一个交互式的登录shell被调用时,或者作为一个使用--login选项的非交互式shell被调用时,它首先尝试从/etc/profile~/.profile依次读取和执行命令。--noprofile选项可以被用来禁止这种行为。当以sh的名字作为交互式shell被调用时,Bash会寻找变量ENV,如果它被定义了,就扩展它的值,并使用扩展后的值作为要读取和执行的文件名。 由于以sh的名字被调用的shell不会试图从任何其他启动文件中读取和执行命令,--rcfile选项没有作用。 以sh的名字被调用的非交互式shell不会试图读取任何其他启动文件。

当以sh的方式调用时,Bash在读取启动文件后会进入POSIX模式。

POSIX模式下被调用

当Bash以POSIX模式启动时,如同--posix命令行选项一样,它遵循POSIX启动文件的标准。在这种模式下,交互式shell会扩展ENV变量,并从名称为扩展值的文件中读取和执行命令。 没有读取其他启动文件。

由远程shell守护程序调用

Bash 尝试确定它何时在其标准输入连接到网络连接的情况下运行,如何时由历史远程 shell 守护进程(通常是 rshd )或安全 shell 守护进程 sshd 执行。 如果 Bash 确定它正在以这种方式非交互地运行,它从 ~/.bashrc 读取并执行命令,前提是该文件存在且可读。如果作为sh 调用,它不会执行此操作。--norc 选项可用于禁止此行为,并且--rcfile 选项可用于强制读取另一个文件,但rshdsshd 通常都不会使用这些选项调用 shell 或允许指定它们。

使用不相等的有效和真实UID/GID调用

如果Bash是在有效用户(组)ID不等于真实用户(组)ID的情况下启动的,并且没有提供-p选项,则不会读取启动文件,不会从环境中继承shell函数,SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量(如果它们出现在环境中)将被忽略,并且有效用户ID被设置为真实用户ID。如果在调用时提供了-p选项,则启动行为是相同的,但有效用户ID不会被重置。

最后更新2023-02-20
0 个评论
上一篇: 6.1 调用Bash
下一篇: 6.3 交互式shell