Linux 努力从Unix编程环境中复制终端(1983年)

Linux 努力从Unix编程环境中复制终端(1983年),linux,unix,terminal,Linux,Unix,Terminal,我一直在阅读Unix编程环境并执行所包含的练习。我知道这项工作有些过时,但我发现它是一个极好的资源 在第一章中,有几个练习,其中向读者展示了与终端的交互,并要求读者解释交互。以下是一个例子: 练习1-1。解释发生了什么 $ date\@ 在本文中,解释了将@解释为行终止字符。我的系统上的等价物是^u,但我可以用stty kill@模拟书中的终端 基于阅读和我的直觉,我希望调用date\@会返回以下效果: date@: command not found 文本支持这一推理: 如果在\或@前面加

我一直在阅读Unix编程环境并执行所包含的练习。我知道这项工作有些过时,但我发现它是一个极好的资源

在第一章中,有几个练习,其中向读者展示了与终端的交互,并要求读者解释交互。以下是一个例子:

练习1-1。解释发生了什么

$ date\@
在本文中,解释了将
@
解释为行终止字符。我的系统上的等价物是
^u
,但我可以用
stty kill@
模拟书中的终端

基于阅读和我的直觉,我希望调用
date\@
会返回以下效果:

date@: command not found
文本支持这一推理:

如果在
\
@
前面加反斜杠
\
,它就失去了特殊意义。因此,要输入#或@,请键入
\\\\\
\@

我的问题是,我甚至无法在终端中键入示例。我一键入
@
,该行即被删除。反斜杠似乎不会转义换行符

假设我对转义字符应该如何与终端控制字符交互的看法是正确的,那么如何设置我的系统(Ubuntu GNU/Linux)来模拟文本中的行为呢

下面是另一个类似的练习:

练习1-2。大多数shell(虽然不是第7版shell)将
解释为引入注释,并忽略从
到行尾的所有文本。鉴于此,假设您的擦除字符也是
#
,请解释以下文字记录:


由于我的擦除字符设置为
#
,无法复制此成绩单。反斜杠似乎不会转义擦除字符。

终端会在Shell之前获取并响应您的击键。因此shell没有机会逃脱@,因为终端首先删除整行

你打字的时候

stty kill @
你让炮弹告诉终端在你每次按下时切断线路@

类型

您的shell将开始按照您期望的方式运行,^u将为您消除线路

^v是终端的转义字符

\这是一个古老的问题,关于一本更古老的书,但我想在这里澄清一下,因为目前接受的答案没有回答你的问题

信不信由你,当我在1985年从这本书(!)中学习UNIX时,书中的这部分已经过时了,关于“#”、“@”和“\”的内容已经不起作用了,我记得我和你一样困惑于为什么它不起作用,以及我是否做错了什么。但这本身并没有错——只是过时了。让我来解释一下,在上一个时代(也许在这本书出版前的十年?)这种说法是如何正确的:

在CRT终端出现之前,有“电传打字机”终端——基本上是打字机,它将您键入的字符(以及远程响应)打印在纸上。在这种电传打字机上,没有“退格”。无法删除已键入的内容。按照惯例,你输入了一个“#”,它从逻辑上删除了前一个字符。你仍然可以在纸上看到它们,但必须想象它们都是从计算机输入中删除的。所以如果你在纸上看到

helk#lo world
计算机实际上收到了“hello world”,其中“#”删除了后面的“k”。 UNIX还允许您键入一个字符“@”,以删除刚才键入的整行(如果您犯了很多错误)。所以

oops I wrote a lot of crap I need to erase@hello world
再次被解释为“你好,世界”

最后,由于有时您希望键入实际的“#”或“@”字符,并将其按字面理解,而不是作为字符擦除或行擦除命令,因此您还有一个“转义字符”,在早期是“\”。注意,这个转义字符不是由shell解释的,而是由Unix内核的终端驱动程序解释的,它与电传打字机通信


当新的CRT终端出现时,这些约定很快被淘汰,并成为我们今天所知道的:默认的擦除字符不再是“#”,而是退格键或删除键,它真正擦除屏幕上的字符。换行符变为control-X或control-U。您也可以使用“stty”命令更改这些字符,设置“erase”、“kill”或“lnext”属性,但人们很少这样做。“stty-a”向您显示这些特殊字符(以及更多字符)的所有当前设置。

恐怕这并不能回答我的问题。我了解如何恢复终端的原始行为。我想知道为什么用反斜杠转义换行终止字符似乎没有任何效果。因为终端首先读取换行终止字符。没有留下任何行供shell读取。你和终端通话,终端和外壳通话。如果您告诉终端终止一行,它将不会将该行发送到shell。该文本表明内核中还有另一种解释反斜杠的机制:“当擦除或终止行字符前面有反斜杠时,内核将丢弃该反斜杠并保留以下字符而不进行解释”。现在不是这样了吗?有没有办法模仿这种行为?您描述的行为就是所有shell的工作方式。你的也一样。您似乎缺少的一点是,终端不是外壳。这是两件不同的事情,我理解这一点。请看我添加的澄清示例。无论如何,要在现代机器上“重现”古代终端感觉,请执行:stty擦除“#”;stty kill'@';stty
helk#lo world
oops I wrote a lot of crap I need to erase@hello world