终端 vs bash?

tem*_*ame 34 shell bash terminal

我在 Mac 上,但我认为这通常适用于 Unix。

我正在学习 shell 脚本,但我似乎缺少一些东西。当我在普通终端中时,我可以使用诸如for循环之类的脚本语法与命令结合使用来做事。

但是....bash为shell脚本打开一个解释器。

这是我感到困惑的地方,因为终端不是已经是 shell 脚本的解释器,正如脚本在提供给 stdin 时可以工作的事实所证明的那样?

额外的问题:它bashbash -i, 根据man“开始交互式会话”有何不同……这不是您bash自己输入时会发生的情况吗?在我看来,这与首先在普通终端中没有什么不同......

Ant*_*ala 39

在这张照片的机器是(视频)终端,更具体地VT100数字设备公司。

来自维基百科的VT100终端

几十年前,当计算机很大时,他们本可以拥有一个终端,一个带有显示器和键盘的虚拟设备,通过电缆连接到主计算机,而不是为每个用户配备个人计算机。VT100 不是计算机,而只是键盘和显示器。通常有几个连接到一台计算机。

因此,几十年前,Unix 计算机是通过终端访问的,终端是一种物理设备。随着个人计算机的出现,图形用户界面变得司空见惯,有(现在仍然)有一种方法可以访问 Unix 命令行,就像通过这样的终端设备 - 称为终端模拟器的应用程序一样。所述终端在OS X的程序是一个终端仿真器; 当今的大多数终端模拟器仍然非常接近地模拟相同的 VT100 设备,即大多数在Terminal应用程序窗口中运行的程序看起来与在 70 年代的大型计算机上运行时的外观完全相同,并且数据显示在这样的终端设备上。对于节目,每个终端模拟器中的窗口就像这些设备之一;大多数命令行程序都没有注意到差异(尽管您可能会发现很难将真正的 VT100 连接到您的 MBP)。


视频终端是一种称为硬拷贝终端的设备的继承者,该设备具有键盘和打印机——程序的所有输出都将打印在纸上。可以想象,视频终端是对此类设备的一大改进。硬拷贝终端的示例,TeleType Model 33 ASR:

TeleType 33 型 ASR

这种设备也被称为电传打字机电传打字机或简称tty;并且tty从 70 年代初就一直存在,这样的设备或终端模拟器的界面仍然称为tty,并且在许多编程语言中,输出文本以在终端窗口中显示仍然称为“打印”;本来这不是比喻,而是事实。


shell 一直存在——从 Unix 诞生之日起,它就是在您在终端上输入您的登录名和密码后运行的程序,用于访问中央计算机。第一个 shell 程序是1971 年的Thompson shell ( sh),1977 年被Bourne shell(也称为sh. 早期,它被设计成只是另一个可以轻松更新的程序,并且用户可以运行他们自己的程序而不是默认的 shell。

GNU 项目随后从头开始制作了一个改进的 shell bash,它是Bourne-again shell 的缩写,Apple 决定也将它与 MacOS X 一起发布。


早在 1970 年代,区别就很明显了:终端是看起来像 30 公斤重的固体铸铁框架,包裹在奶油色塑料外壳中,在您面前有一个玻璃显示屏和键盘,甚至是一个只有键盘的设备和打印机,而 shell 是在主计算机上运行的程序,用于解释您的命令。

  • 欢迎来到 Unix,+1 以获得有见地的答案。 (3认同)

Mic*_*mer 33

当您启动终端时,它将始终在其中运行一些程序。该程序通常默认为您的 shell。在 OS X 上,默认 shell 是 Bash。结合起来,这意味着当您启动终端时,您会得到一个bash在其中运行的终端仿真器窗口(默认情况下)。

如果您愿意,您可以将默认 shell 更改为其他内容,尽管 OS X 仅附带bashtcsh。您可以选择在新终端中使用以下open命令启动自定义命令

open -b com.apple.terminal somecommand
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您的 shell没有在其中运行,当您的自定义命令终止时,事情就结束了。

如果您bash在已经运行的终端中运行bash,您会得到确切的结果:一个 shell 运行另一个 shell。您可以使用Ctrl-D或退出内壳,exit然后返回到开始时的壳。 如果您想测试配置更改或临时自定义环境,这有时会很有用 - 当您退出内壳时,您所做的更改有时会很有用让它走开。您可以任意深度嵌套它们。如果您不这样做,则启动另一个没有实际意义,但是像这样的命令bash some-script.sh只会运行该脚本然后退出,这通常很有用。


交互式 shell 和非交互式 shell 之间的区别有点微妙,主要涉及加载了哪些配置文件、存在哪些错误行为以及是否启用了别名等。粗略的原则是,交互式 shell 为您提供坐在它前面所需的设置,而非交互式 shell 为您提供独立脚本所需的设置。所有差异都明确记录在Bash 参考手册中,也在这个站点上的一个专门问题中

在大多数情况下,你不需要关心。通常没有理由启动另一个 shell,当您启动时,您将有一个特定的目的并知道如何处理它。

  • @Aerovistae 您可以检查您的终端是否运行 bash 或不只执行 `ps $$` (2认同)

jll*_*gre 9

您首先缺少终端已经在运行bash(或另一个 shell 解释器)。

在您的情况下,终端,更准确地说是终端模拟器,只是将按键传递给底层程序并显示发送给它的任何字符的设备。虽然它默认运行一个 shell,但没有任何东西禁止启动一个运行不同文本应用程序的终端,比如文本编辑器或其他任何东西。

如果您已经在交互式会话中,那么运行bashbash -i不会真正产生影响。

  • `bash` 命令在现有的 shell 之上运行一个新的 shell。它更改提示(或更准确地将其重置为默认值)的事实是由于未读取初始化脚本。 (2认同)