找到问题的答案有点困难,也许是因为我问错了问题。
我了解 bash 脚本。我一直写它们是为了重复做一些有用的小事情。
但是我想知道 shell 脚本和在 shell 中运行的程序之间的区别。例如,什么是松树?它是用什么语言写的?它在 shell 中运行,但据我所知,它不是 shell 脚本,而是一个独立的程序,您可以在其中导航,当您退出时,您将返回到启动 shell 时所在的位置。
如果我想编写一个功能类似于 pine 的程序,因为它作为具有各种功能的程序在 shell 中运行,我应该从哪里开始呢?在哪里可以找到用这种方式编写的程序的一些示例?
答案1
我认为您将shell
(命令行解释器)与终端模拟器混淆了。
shell,当交互运行时pine
需要终端或终端仿真器与用户交互。pine
但与外壳无关。
过去的终端是一种带有显示器和键盘的设备,通过串行线路连接到计算机,以便与计算机(本身没有显示器或键盘)进行交互。界面简单且基于文本。
计算机上的串行线是一个字符设备文件(/dev/ttyS0
例如Linux上的类似)。与终端交互的应用程序将数据写入该设备以在终端上显示。
例如,在最简单的情况下,pine
写入 ASCIIa
将/dev/ttyS0
导致与该字符对应的位序列a
通过串行线路发送,并且终端a
在屏幕上当前光标位置处显示 。
当用户按下a
键盘时,在最简单的情况下,终端会在另一条线上发送相同的位序列到计算机,系统将字符放在a
缓冲区中,当pine
执行read()
on时/dev/ttyS0
,它会返回a
特点。
终端已经从诸如电传打字机(没有屏幕,打印a
在纸上)之类的东西发展到带有 CRT 显示器的终端,然后一些终端还具有更多功能,例如光标定位、区域清除/滚动、颜色支持,所有这些都pine
使用或甚至图形功能。 X 后来提供了一种更先进的方式来与计算机进行交互,这次是通过网络而不是串行线路和窗口功能,并且这次使用了更复杂的协议,而不仅仅是要发送的字符序列和一些转义序列。
尽管如此,我们还是为该终端编写了数十年的应用程序。有很多事情可以用终端完成,而 X 无法完成。因为数据只是双向的两个字符流,所以很容易通过网络导出终端会话(想想telnet、ssh),以及类似的应用程序cat
可用于写入终端以显示文件内容供用户在屏幕上查看,并且可以以完全相同的方式使用,无需修改即可将相同的内容存储在文件或通过网络发送到某个服务器...(所需要的只是重定向输出所在的位置)。同样的事情对于通常只有一种用途并且不能轻易相互协作的X应用程序来说是做不到的。
由于这些原因以及更多原因,即使在 X 广泛传播很久之后,终端仍然在使用。
只是,现在,我们没有真正的终端,而是有像xterm
、gnome-terminal
、eterm
... 这样的终端模拟器,它们模拟终端,但它们本身只是 X 应用程序(在计算机上运行并显示在 X 服务器上、同一台计算机或另一台计算机上) )。
默认情况下,当您启动此类终端仿真器应用程序时,会在其中启动一个 shell,这就是为什么有时两者之间会出现混淆的原因。您不必在终端仿真器中运行 shell,pine
不必由 shell 启动,但它确实需要终端。它是一个半图形终端应用程序。它与终端设备交互,在该设备的另一端,它期望终端或终端模拟器具有最少的功能集,例如光标定位、突出字符突出显示......