努力从Unix编程环境(1983)重现terminal,

我一直在阅读Unix编程环境和执行包含的练习。 我明白这项工作有点过时,但我发现它是一个很好的资源。

在第一章中,有几个练习,读者被提出与terminal交互,并被要求解释交互。 这里是一个例子:

习题1-1 。 解释发生了什么事

$ date\@ 

在文中,解释了@被解释为行杀字符 。 我的系统上的等价物是^u ,但是我可以用stty kill @在本书中模拟terminal。

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

 date@: command not found 

文本支持这个推理:

如果你在#@之前加了一个反斜杠\ ,就失去了它的特殊含义。 所以要input#或@,input\#\@

我的问题是,我甚至无法在我的terminal中input示例。 只要我input@ ,行就会被删除。 反斜杠似乎不能逃避行杀的字符。

假设我对转义字符如何与terminal控制字符交互是正确的,我怎样才能build立我的系统(Ubuntu GNU / Linux)来模拟文本的行为?

这是另一个类似的练习:

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

 $ date Mon Sep 26 12:39:56 EDT 1983 $ #date Mon Sep 26 12:40:21 EDT 1983 $ \#date $ \\#date #date: not found $ 

用我的擦除字符设置为# ,这是不可能复制这个成绩单。 反斜杠似乎没有逃避擦除字符。

终端在Shell执行之前获取并响应您的按键。 所以shell自从终端首先删除整行之后就没有机会逃离了。

当你输入

 stty kill @ 

你告诉shell要告诉终端每次按@

类型

 stty kill ^u 

你的外壳将开始按照你的期望行事,并且会为你杀掉线条。

^ v是终端的转义字符
\是shell的转义字符。