为什么我们有登录,非登录,交互式和非交互式bash shell?


23

因此,bash手册页解释了什么是登录和交互式shell:

登录外壳是一个参数为零的第一个字符为-的外壳程序,或以--login选项开头的外壳程序。

交互式外壳程序是一个不带非选项参数且不带-c选项(其标准输入和错误均连接到终端(由isatty(3)确定))启动的外壳程序,或一个以-i选项启动的外壳程序。如果bash是交互式的,则设置PS1并且$-包括i,从而允许shell脚本或启动文件测试此状态。

我认为这意味着我们可以有4种不同类型的Shell:

  • 交互式登录外壳,
  • 非交互式登录外壳,
  • 交互式非登录外壳,
  • 非交互式非登录外壳

但是为什么我们首先要有交互式/非交互式和登录/非登录shell?为什么是品种?如果只有一种外壳,我们会损失什么?

另外,当尝试通过运行来确定我是否在登录外壳程序中时echo $-,它也会输出:

himBH

关于这些标志的解释这里,但是hHm没有解释。是否有描述所有这些标志的地方?

Answers:


21

这些是我对不同类型的shell的想法-不幸的是,我从一开始就没有看到Un * x的兴起(我认为这个概念在历史上已经发展到很好的程度了),所以请务必提出批评。

  • 当我登录系统时(今天通过图形X登录),可能有些任务应该运行一次,例如,建立与某种服务器的连接,向我显示今天的待办事项列表,自动启动一些命令,等等。我每次打开新终端时都不会遇到麻烦。因此,有一组配置文件(/etc/profile~/.bash_login以此类推,请参阅手册以获取准确的列表),这些文件仅由登录 Shell 来源。
  • 因此,要关闭连接,杀死一些程序,运行登录外壳程序存在~/.bash_logout时的备份脚本。
  • 因此,我在终端机中使用的“普通”外壳不应保留登录外壳,但仍应从中读取我的个人偏好~/.bashrc,因为我希望我的键绑定与该外壳进行交互-因此,这是一种交互式的非登录外壳。
  • 最后,但并非最不重要的一点是,当使用bash编写脚本时,这两项都不重要。bash应该尽可能快地启动,即不应读取任何配置文件。这是一个非交互式,非登录外壳

因此,我对您问题的回答如果仅使用一种类型的外壳,我们将损失什么?一句话就是:“灵活性”。


第二个问题的答案很简单:

$-列出当前的选项集。这些可以通过命令行参数设置bashset内置参数,也可以通过内置参数设置。因此,您必须查看手册中的两个地方:

  • OPTIONS 部分:

    -i        If the -i option is present, the shell is interactive.
  • SHELL BUILTIN COMMANDS部分,小节set

    -h      Remember the location of commands as they are looked up for execution.  This is enabled by default.
    -m      Monitor  mode.  Job control is enabled.  This option is on by default for interactive shells on systems that sup
            port it (see JOB CONTROL above).  Background processes run in a separate process  group  and  a  line  containing
            their exit status is printed upon their completion.
    -B      The shell performs brace expansion (see Brace Expansion above).  This is on by default.
    -H      Enable !  style history substitution.  This option is on by default when the shell is interactive.
    

1
哇,我相信对OP明确提出的问题的@mpy答案能够成功消除一些相当有用的定义。关于这一点:因此,非登录Shell只是登录Shell的一部分吗?
tuk0z 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.