我正在读《UNIX 分时系统 Dennis M. Ritchie 和 Ken Thompson”论文并作为标准输入/输出重定向的示例,它给出了 ed 编辑器的示例:
该命令
ed <script
将脚本解释为编辑器命令的文件;因此“<script
”的意思是“从……获取输入script
”。
然而,如果我使用 vim 尝试相同的操作,我会收到一条错误消息“读取输入时出错”:
[m@localhost rough]$ vim t2 <t
Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
为什么会这样呢?
答案1
ed
并且ex
是行编辑器。它们具有可以由文本文件中的行驱动的用户界面。
vi
以及它的所有克隆版本,例如 VIM全屏编辑器。它们的用户界面不将输入和输出视为文本文件行。输入是单个字符和未分组为行的字符序列。输出是用于在视频终端上绘图的单个字符以及转义和控制序列。
模型为用户输入/输出因为文本文件不会映射到交互式全屏 TUI 程序,更不用说映射到 GUI 程序了。
您得到的行为因程序而异。一些全屏 TUI 程序会识别出它们的标准输入不是终端,并中止,就像nvi
这样。其他工具(例如 VIM)会发出警告,但会将非终端输入文件视为终端输入,这对于希望将输入视为脚本命令的人来说会产生一些奇怪的行为。还有一些,例如less
,显式地为用户界面打开终端设备,并且不使用标准 I/O(输入部分)。还有一些 shell,像大多数 shell(请注意,其交互用户界面不仅仅是行模式)一样,会下降到非交互模式。
1974 年撰写的有关 Unix 的论文并不能很好地指导行模式用户界面和全屏用户界面之间的区别。 George Coulouris 的第一个视频终端 Unix 编辑器可能em
是在一年后出现的。未来还有 termcap、具有(自己的)命令行编辑功能的 shell,以及使用非图形特殊字符的行规则默认值。