登录shell和交互式shell之间有什么区别?

cae*_*sar 56 bash shell interactive-shell

什么是login shellinteractive shell,什么是.bash_profile.bashrc

cda*_*rke 70

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

交互式shell通常从用户终端读取和写入.

[ gnu bash手册 ]

一个登录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
Run Code Online (Sandbox Code Playgroud)

一个交互式壳是一个读取命令,从它的标准输入,通常是一个终端.

例如,如果您使用类似的xterm或终端模拟器登录bash putty,则会话既是登录shell又是交互式.如果然后键入bash然后输入交互式shell,但它不是登录shell.

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

启动文件在bash中非常容易定制:

当调用登录bash shell时,则/etc/profile获取(在当前环境中执行).之后,检查三个文件是否存在.这些文件的检查按以下顺序进行:

if if /etc/profile,source(run)it
if ~/.bash_profile,source(run)it
if ~/.bash_login,source(run)it
if ~/.profile,source(run)it

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

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

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

  • “一旦找到匹配项,其他文件将被忽略,即使它们存在”是不正确的每个人 bash > INVOCATION,它说 bash“首先从文件 /etc/profile 读取并执行命令,如果该文件存在。阅读后该文件,它会查找 ~/.bash_profile、~/.bash_login 和 ~/.profile” (3认同)
  • 我真的很感谢宝贵的意见。谢谢 ! (2认同)
  • 对于启动时加载的文件,请参阅`INVOCATION`部分的`man bash`,其中的信息很可能更清晰. (2认同)
  • @mellow-yellow,我同意首先会获取`/etc/profile`,但应该强调的是`~/.bash_profile`、`~/.bash_login`和`~/.profile`将会被查找for 按顺序,并且**如果找到一个,则忽略以下文件**(答案部分正确)。我已经验证了它(我在`/etc/profile`中定义了`JAVA_HOME`,在`~/.bash_profile`中定义了`BASH_PROFILE_SOURED`,在`~/.bash_login`中定义了`BASH_LOGIN_SOURCED`,在`~/.bash_login`中定义了`BASH_DEFAULT_PROFILE_SOURCED`。 profile`。在新登录的shell中,仅定义了`JAVA_HOME`和`BASH_PROFILE_SOURED`)。 (2认同)

ark*_*cha 5

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

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