登录Shell和交互式Shell有什么区别?

137

什么是登录shell交互式shell,以及.bash_profile.bashrc 有什么区别?


1
请见 http://serverfault.com/questions/8882/what-is-the-difference-between-a-login-and-an-interactive-bash-shell。 - devnull
2
另请参阅 https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html - devnull
2个回答

152
一个交互式的shell是指在没有非选项参数的情况下启动的,除非指定了-s选项,没有指定-c选项,并且其输入和错误输出都连接到终端(通过isatty(3)确定),或者使用-i选项启动的shell。
交互式shell通常从用户的终端读取并写入数据。
[GNU Bash手册](link1)
登录shell是你登录时使用的shell。你可以通过ps -f命令的输出来识别登录shell,它的程序名称开头会有一个连字符,例如:
root      3561  3553  0 09:38 pts/0    00:00:00 -bash
qa        7327  3432  0 10:46 pts/1    00:00:00 -bash

一个交互式的shell是从标准输入读取命令的shell,通常是一个终端。
例如,
- 如果你使用xterm或类似putty的终端模拟器登录bash,那么会话既是登录shell又是交互式shell。 - 如果你输入bash,则进入一个交互式shell,但不是登录shell。
如果运行一个shell脚本(包含shell命令的文件),那么它既不是登录shell也不是交互式shell。
在bash中,启动文件可以高度定制:
当调用登录bash shell时,会执行/etc/profile。之后,会检查三个文件是否存在,并按照顺序运行第一个存在的文件。
  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
一旦找到匹配项,其他文件将被忽略,即使它们存在。 /etc/bashrc 文件可能被 ~/.bash_profile~/.bashrc 文件同时使用。这意味着无论是登录还是非登录shell,/etc/bashrc 文件都会在所有交互式的bash调用中被引用。
因此,每当您请求一个新的交互式shell时,.bashrc 文件也会运行。这不包括shell脚本。通常,变量、别名或函数会放置在这个文件中。
如果适当地指示,Bash shell脚本会读取不同的文件。如果用户定义了一个包含文件名的变量BASH_ENV(通常在他们自己的.bash_profile中),脚本将读取该文件。如果未设置(并导出)此变量,则bash脚本将不会读取任何启动文件。

2
非常感谢您宝贵的评论。谢谢! - caesar
2
请参阅“INVOCATION”部分的“man bash”,了解有关启动时加载的文件的信息,那里的信息很可能更清晰明了。 - sjas
1
@CMCDragonkai:是的。可以使用--login(或-l)选项启动非交互式bash进程。例如,当从crond运行时,您可能希望执行所有启动文件。但是,一些脚本错误地假定登录等同于交互式。 - cdarke
7
根据 man bash > INVOCATION,"一旦找到匹配项,其他文件将被忽略,即使它们存在"这个说法是不正确的。man bash指出bash会先从文件/etc/profile中读取并执行命令(如果该文件存在)。读取完该文件后,bash会再查找/.bash_profile、/.bash_login和~/.profile文件。 - mellow-yellow
2
@mellow-yellow,我同意/etc/profile将首先被调用,但应强调按顺序查找~/.bash_profile~/.bash_login~/.profile如果找到其中一个,则忽略以下文件(答案部分正确)。我已经验证过了(我在/etc/profile中定义了JAVA_HOME,在~/.bash_profile中定义了BASH_PROFILE_SOURED,在~/.bash_login中定义了BASH_LOGIN_SOURCED,在~/.profile中定义了BASH_DEFAULT_PROFILE_SOURCED。在新的登录shell中,只有JAVA_HOMEBASH_PROFILE_SOURED被定义)。 - Gary Wang
显示剩余3条评论

9

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

登录shell仅因一个或多个初始设置脚本(资源)在启动时加载而与任何其他shell不同,通常以“profile”命名。 在那里定义了基本设置,这些设置派生给随后打开的shell(因此它们只需要定义一次)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接