man bash 2 调用

调用(Invocation)

登录shell(login shell)的参数0($0)的第一个字符为-,或者由--login选项启动。

$ echo $0
-bash

交互式shell(interactive shell)启动时没有非选项参数且没有-c选项,它的标准输入和标准错误都连接到终端(由isatty(3)决定);或者由-i选项启动。如果bash是交互式的,PS1被设置且$-包含i,这样shell脚本或者启动文件能测试这种状态。

下面的段落描述了bash如何执行它的启动文件。如果文件存在但不可读,bash会报告一个错误。文件名中的波浪字符(~)被扩展。

当bash以交互式登录shell被调用,或者是非交互式shell带有--login选项,它会先从文件/etc/profile中读取并执行命令。然后它先后查看~/.bash_profile~/.bash_login~/.profile,从第一个存在且可读的文件中读取并执行命令。--noprofile可以用来在shell启动时阻止这个行为。

当登录shell退出时,bash从文件~/.bash_logout中读取并执行命令。

当交互式shell(非登录shell)启动时,bash从~/.bashrc中读取并执行命令。这个可以由--norc选项阻止。--rcfilefile选项使得bash从file中读取并执行命令。

当bash以非交互式启动,比如运行脚本,它会在环境中查看变量BASH_ENV,如果有则扩展它的值,然后把扩展的值当成文件名,从中读取并执行命令。就好像执行了如下命令:

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

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

如果bash以名字sh被调用,它会尽量模仿sh历史版本的启动行为,同时遵循POSIX标准。如果是交互式登录shell,它读取/etc/profile~/.profile--noprofile禁止此行为)。如果是交互式shell,它查看变量ENV,用它的值做为启动文件。以sh调用的shell不会去读其它的启动文件,--rcfile选项没有效果。非交互式shell不读取任何启动文件。读取启动文件后bash进入posix模式。

如果bash以posix模式启动,如--posix选项,它遵循POSIX标准的启动文件。这种模式下,交互式shell扩展ENV变量的值做为启动文件。没有别的启动文件。

bash会尝试判断它的标准输入连接到网络,比如远端shell守护进程,一般是rshd或者安全shell守护进程sshd。如果是这样,它会从~/.bashrc中读取并执行命令。如果是以sh被调用就不会这样。--norc选项可以禁止此行为,而--rcfile选项可以用来指定另一个文件。但是rshd一般不会在调用shell时带这些选项或者允许指明这些选项。

如果shell启动时有效用户/组id不等于真实用户/组id,同时没有-p选项,将不读取启动文件,shell函数不会从环境中继承,环境中的SHELLOPTSBASHOPTSCDPATHGLOBIGNORE变量被忽略,有效用户id被设置成真实用户id。如果有-p选项,启动行为一样,但是有效用户id不会被重置。


你可能感兴趣的:(man bash 2 调用)