什么是login shell
and interactive shell
,什么是.bash_profile
and .bashrc
?
2 回答
交互式 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 脚本将不会读取任何启动文件。
由于您可能知道什么是“shell”并且正在使用它,因此您的问题仅针对登录 shell 与其他所有内容之间的区别...
登录 shell 与任何其他 shell 的不同之处仅在于启动时会加载一个或多个初始设置脚本(资源),通常在其名称中以“配置文件”命名。在那里定义了派生到随后打开的外壳的基本设置(因此它们只需要定义一次)。