Wil*_*ard 5 io-redirection tty cat control-characters
我刚刚注意到,在通过cat
和重定向创建快速测试文件(例如,使用示例输入)时,我在不同的系统上看到了不同的行为。
以下是了解我在说什么的步骤:
运行cat > testfile
。
输入helli
,然后按退格键,然后输入o
。
按 Enter。
键入 Ctrl-D 结束输入。
运行od -a testfile
。
在某些系统上,例如 Mac,您将获得:
0000000 h e l l o nl
0000006
Run Code Online (Sandbox Code Playgroud)
在其他系统上,例如我通过 Windows 上的 MobaXterm 登录的 RHEL 5.7 主机,您可能会得到:
0000000 h e l l i bs o nl
0000010
Run Code Online (Sandbox Code Playgroud)
造成这种差异的代码在哪里?例如,在上面的例子中,我应该怀疑 MobaXterm,还是 RHEL 5 系统?或者我的键盘和文件系统之间的哪一层?
这与其说是一个真正的问题,不如说是一个出于好奇的问题;我显然可以通过使用文本编辑器来创建没有退格字符的文件,但这在过去让我感到困惑。有一次在一次随意的演示/培训期间,我提到通过创建文件cat
存在这个问题,退格字符被逐字取用,只是在学生使用的 Mac 上根本没有这种效果时才会显示错误。 所以这让我很好奇。
小智 4
这取决于 a) 当按下 BackSpace 键(^H
/BS
或^?
/ DEL
)时终端仿真器发送什么字符,以及 b) tty 驱动程序使用什么字符(请参阅并使用--VERASE
更改后者)。stty(1)
stty erase ^H
如果终端仿真器正在发送^H
但 tty 未将其识别为特殊字符,则按 BackSpace 键将在视觉上“擦除”屏幕上的最后一个字符[1],但该字符将按原样发送(与它前面的字符)到从 tty ( cat
) 读取的进程。
具有行编辑功能的编辑器和交互式程序将 tty 设置为原始模式并自行处理特殊字符,并且可能将^H
和视为^?
相同;cat
不是其中之一;-)
[1] 这取决于设置echoctl
stty
——如果设置了,终端将以格式回显控制字符"^"+chr(char^0x40)
(^H
forBS = 8
等)。