91

什么是login shelland interactive shell,什么是.bash_profileand .bashrc

4

2 回答 2

110

交互式 shell 是在没有非选项参数的情况下启动的,除非指定了 -s,但没有指定 -c 选项,并且其输入和错误输出都连接到终端(由 isatty(3) 确定),或者以-i 选项。

交互式外壳通常读取和写入用户终端。

[ gnu bash 手册]

登录外壳是您登录的外壳。您可以从列表中识别登录 shell ps -f,它会在程序名称的开头有一个连字符,例如:

root      3561  3553  0 09:38 pts/0    00:00:00 -bash
qa        7327  3432  0 10:46 pts/1    00:00:00 -bash

交互式外壳是从标准输入读取命令的外壳,通常是终端。

例如,如果您使用 xterm 或终端仿真器(如 )登录 bash putty,则会话既是登录 shell,又是交互式 shell。如果您随后键入bash,那么您将进入一个交互式 shell,但它不是登录 shell。

如果运行 shell 脚本(包含 shell 命令的文件),则它既不是登录 shell,也不是交互式 shell。

启动文件在 bash 中是高度可定制的:

当一个登录 bash shell 被调用时,然后/etc/profile是 source(在当前环境中执行)。之后,检查三个文件是否存在。这些文件的检查按以下顺序完成:

如果/etc/profile存在,源(运行)它
如果~/.bash_profile存在,源(运行)它
如果~/.bash_login存在,源(运行)它
如果~/.profile存在,源(运行)它

一旦找到匹配项,其他文件将被忽略,即使它们存在。该/etc/bashrc文件可能由~/.bash_profile~/.bashrc文件使用。这意味着该/etc/bashrc文件源自 bash 的所有交互式调用,无论它是登录 shell 还是非登录 shell。

因此,.bashrc每次您请求新的交互式 shell时,该文件也会运行。这不包括 shell 脚本。通常变量、别名或函数都放在这个文件中。

如果得到适当的指示,Bash shell 脚本会读取不同的文件。如果用户定义(通常在他们自己的.bash_profile)一个包含文件名的变量BASH_ENV,脚本将读取它。如果未设置(并导出)此变量,则 bash 脚本将不会读取任何启动文件。

于 2013-08-12T12:47:22.950 回答
5

由于您可能知道什么是“shell”并且正在使用它,因此您的问题仅针对登录 shell 与其他所有内容之间的区别...

登录 shell 与任何其他 shell 的不同之处仅在于启动时会加载一个或多个初始设置脚本(资源),通常在其名称中以“配置文件”命名。在那里定义了派生到随后打开的外壳的基本设置(因此它们只需要定义一次)。

于 2013-08-12T12:37:08.573 回答