bash参考手册之六(Bash特性)续一

来源:互联网 发布:联通4g网络模式 编辑:程序博客网 时间:2024/05/21 21:02

6.2 Bash启动文件


这部分描述Bash如何执行启动文件。如果文件存在但是不可读,则Bash报告错误。文件名中的波浪符按照波浪符扩展。(见 波浪符扩展 章节)
交互式shell,请参见 交互式shell 章节。

以交互式登录shell调用,或者带 --login 选项
当Bash以交互式登录shell调用,或者带 --login 选项的非交互式shell调用,它首先从 /etc/profile,如果文件存在的话,读取和执行命令。读取该文件后,它按照顺序继续寻找 ~/.bash_profile, ~/.bash_login, 和 ~/.profile ,从其中第一个存在并且可读的文件中读取和执行命令。若要禁止,可以在启动时带 --noprofile 选项。
当登录shell退出时,Bash从 ~/.bash_logout 中,如果存在的话,读取和执行命令。

以交互式非登录shell调用
当Bash以交互式非登录shell调用时,它从 ~/.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变量的值,在此处不用于搜索该文件名。
如上所述,如果非交互式shell带 --login 选项被调用,则Bash将试图从登录shell启动文件中读取和执行命令。

以sh方式调用
当Bash以sh调用时,它尝试尽可能的模拟sh的历史版本的启动行为,同时也遵循POSIX标准。
当以交互式登录shell调用,或者以非交互式shell带 --login 选项调用,它首先试图按顺序从/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试图确定何时把标准输入连接到一个网络连接。如果Bash确定它运行在此情况下,它从 ~/.bashrc 中,如果该文件存在的话,读取和执行命令。而以sh调用时,不会这么做。可以使用 --norc 选项,禁止此行为,而 --rcfile 可以用来强制读取其他文件,但是,rshd 在调用shell时,不使用这些选项。

以有效UID/GID和真实UID/GID调用
如果Bash以不同于真实用户(组)ID的有效用户(组)ID,并且不带 -p 选项启动时,不读取启动文件,不从环境继承shell函数,以及SHELLOPTS, BASHOPTS, CDPATH, 和 GLOBIGNORE,如果它们出现在环境中,则无视,把有效用户ID设置成真实用户ID。如果调用使带 -p 选项,则启动行为一样,但是不重置有效用户ID。


0 0
原创粉丝点击