我一直在阅读 Unix编程环境&执行包含的练习。我知道这项工作有点陈旧,但我发现它是一个很好的资源。
在第一章中,有一些练习,其中向读者呈现与终端&的交互。被要求解释互动。这是一个例子:
练习1-1 。解释
会发生什么$ date\@
在文中,解释了@
将被解释为行杀死字符。我系统上的等效内容为^u
,但我可以使用stty kill @
模拟书中的终端。
基于阅读&我的直觉,我希望调用date\@
返回一些效果:
date@: command not found
该文本支持这种推理:
如果您使用反斜杠
#
在@
或\
之前,则会失去其特殊含义。因此,要输入#或@,请键入\#
或\@
。
我的问题是我甚至无法将示例键入我的终端。只要我输入@
,该行就会被删除。反斜杠似乎不会逃避行杀死字符。
假设我对转义字符如何与终端控制字符交互是正确的,我如何设置我的系统(Ubuntu GNU / Linux)来模拟文本中的行为?
这是另一个类似的练习:
练习1-2。大多数shell(虽然不是第7版shell)将
#
解释为引入注释,并忽略#
到最后的所有文本这条线。鉴于此,请解释以下记录,假设您的擦除字符也是#
:
$ date
Mon Sep 26 12:39:56 EDT 1983
$ #date
Mon Sep 26 12:40:21 EDT 1983
$ \#date
$ \\#date
#date: not found
$
将我的擦除字符设置为#
,无法复制此成绩单。反斜杠似乎没有逃避擦除字符。
答案 0 :(得分:2)
终端在Shell之前获取并响应您的击键。所以shell没有机会逃脱@,因为终端首先删除整行。
键入时
stty kill @
你告诉shell告诉终端每次按@
时都会终止该行类型
stty kill ^u
并且你的shell将开始以你期望的方式运行,^你将为你杀死行。
^ v是终端的转义字符 \是shell的转义字符。
答案 1 :(得分:0)
这是一个古老的问题,关于一本更古老的书,但是我想在这里设置记录,因为当前接受的答案没有回答您的问题。
信不信由你,当我在1985年从本书中学到UNIX(!)时,本书的这一部分已经过时了,关于“#”,“ @”和“ \”的内容已经不起作用了,我还记得像您一样困惑于为什么它不起作用以及我是否做错了什么。但这本身并没有错-只是过时了。让我解释一下在以前的时代(也许是本书出版之前的十年?)这种东西是正确的:
在CRT终端出现之前,就有“电传式”终端-基本上是打字机,可以在纸上打印您键入的字符(以及远程响应)。在这种电传打字机上,没有“退格键”。您无法删除已经输入的内容。因此,约定是您键入“#”,并且在逻辑上擦除了先前的字符。您仍然会在纸上看到它们,但是必须想象它们都已从计算机的输入中删除。所以如果你在纸上看到
helk#lo world
计算机实际上收到了“ hello world”,其中的“#”删除了它后面的“ k”。 如果犯了很多错误,UNIX还允许您键入一个字符“ @”以删除刚键入的 entire 行。所以
oops I wrote a lot of crap I need to erase@hello world
再次被解释为“ hello world”。
最后,由于有时您想键入一个实际的“#”或“ @”字符并使它们按字面意义使用,而不是作为字符擦除或行擦除命令,因此您还具有一个“转义字符”,早期是“ \”。请注意,这个转义符不是由外壳程序解释的,而是由与电传打字机通信的Unix内核的终端驱动程序解释的。
当出现新的CRT终端时,这些约定很快就被淘汰,并成为我们今天所知道的约定:默认的擦除字符不再是“#”,而是退格键或Delete键,并且实际上擦除了屏幕上的字符。 。线路擦除(有时被称为“ kill”)被称为control-X或control-U。转义字符变为control-V。您也可以使用“ stty”命令来更改这些字符,设置“ erase”,“ kill”或“ Inext”属性,但是人们很少这样做。 “ stty -a”显示这些特殊字符(以及更多)的所有当前设置。