我使用的是 Mac,但我认为这通常适用于 Unix。
我正在学习 shell 脚本,但我似乎缺少一些东西。当我在普通终端中时,我可以使用诸如for
循环之类的脚本语法与命令结合来执行操作。
但是...bash
打开一个解释器来执行 shell 脚本。
这就是我感到困惑的地方,因为终端不是已经是 shell 脚本的解释器了吗?正如脚本在提供给 stdin 时起作用的事实所证明的那样?
额外问题:bash
与 有何不同bash -i
,根据man
“开始交互式会话”......这不是您自己输入时会发生的情况吗bash
?在我看来,这与首先在普通航站楼没有什么不同......
答案1
这张图片中的机器是(视频)终端,更具体地说是VT100经过数字设备公司。
几十年前,当计算机很大时,他们可以拥有一个终端,一个带有显示屏和键盘的虚拟设备,通过电缆连接到主计算机,而不是为每个用户配备个人计算机。 VT100 不是计算机,而只是键盘和显示器。通常有几个这样的设备连接到一台计算机上。
因此,几十年前,Unix 计算机是通过终端(物理设备)访问的。随着个人计算机的出现,图形用户界面变得司空见惯,曾经(现在仍然)有一种方法可以像通过这样的终端设备一样访问 Unix 命令行 - 应用程序称为终端仿真器。这终端OS X 中的程序是一个终端仿真器;当今的大多数终端仿真器仍然非常接近地模拟同一个 VT100 设备,即,在应用程序窗口中运行的大多数程序Terminal
看起来与在 70 年代的大型计算机上运行时的样子完全相同,并且数据显示在这样的终端设备上。对于节目来说,每个终端模拟器中的窗口的行为类似于这些设备之一;大多数命令行程序无法注意到差异(尽管您可能会发现很难将正版 VT100 连接到您的 MBP)。
视频终端是一种称为硬拷贝终端的设备的后继者,该设备具有键盘和打印机 - 程序的所有输出都将打印在纸张上。人们可以想象,视频终端是对此类设备的一大改进。硬拷贝终端示例,TeleType Model 33 ASR:
该装置也被称为电传打字机,电传打字机, 或者终端简称;和终端从 70 年代初开始,这种设备的接口或终端仿真器仍然被称为终端,并且在许多编程语言中,输出文本以在终端窗口中显示仍然称为“打印”;本来这不是比喻,而是事实。
shell 一直存在——从 Unix 诞生之日起,它就是你在终端上输入登录名和密码后运行的程序,用于访问中央计算机。第一个 shell 程序是汤普森壳( sh
) 自 1971 年起,于 1977 年被伯恩外壳, 也叫sh
。早期的设计初衷是让它只是另一个可以轻松更新的程序,并且用户可以运行自己的程序而不是默认的 shell。
GNU 项目随后从头开始生产了一个改进的 shell,称为bash
,简称谍影重重 shell,Apple 也决定随 MacOS X 一起提供。
早在 20 世纪 70 年代,区别就很明显:终端是一块看起来像 30 公斤重的实心铸铁框架,包裹在奶油色塑料外壳中,面前有玻璃显示屏和键盘,甚至是只有键盘的设备和打印机,而 shell 是在主计算机上运行的解释命令的程序。
答案2
当您启动终端时,它总是会在其中运行一些程序。该程序通常默认为您的 shell。在 OS X 上,默认 shell 是 Bash。结合起来这意味着bash
当您启动终端时,您会看到一个在其中运行的终端模拟器窗口(默认情况下)。
你可以更改默认外壳如果您愿意,可以更改为其他内容,尽管 OS X 仅附带bash
和tcsh
。您可以选择在新终端中启动自定义命令命令open
:
open -b com.apple.terminal somecommand
在这种情况下,你的外壳不是在其中运行,当您的自定义命令终止时,事情就结束了。
bash
如果您在已经运行的终端中运行bash
,您会得到这样的结果:一个 shell 运行另一个 shell。您可以使用Ctrl-D或退出内壳exit
,然后您将返回到您开始的外壳。如果您想测试配置更改或临时自定义环境,这有时会很有用 - 当您退出内壳时,您所做的更改会很有用。让它消失。您可以将它们嵌套任意深。如果您不这样做,则启动另一个脚本没有任何实际意义,但是类似的命令bash some-script.sh
将仅运行该脚本然后退出,这通常很有用。
交互式 shell 和非交互式 shell 之间的差异有点微妙,主要涉及加载哪些配置文件、存在哪些错误行为以及是否启用别名和类似行为。粗略的原则是,交互式 shell 为您提供了您想要的设置,而非交互式 shell 为您提供了独立脚本所需的设置。所有差异都明确记录在Bash 参考手册,并且也在本网站上有一个专门的问题。
大多数情况下,您不需要关心。通常没有理由启动另一个 shell,当您这样做时,您会想到一个特定的目的并知道如何处理它。
答案3
bash
首先,你错过了你的终端已经在运行(或另一个 shell 解释器)。
在您的情况下,终端(更准确地说是终端模拟器)只是将击键传递给底层程序并显示发送给它的任何字符的设备。虽然它默认运行 shell,但没有什么禁止启动运行不同文本应用程序的终端,例如文本编辑器或其他应用程序。
如果您已经处于交互式会话中,那么运行bash
并bash -i
不会真正产生影响。