什么决定退格符是否出现在用 cat 创建的文件中?

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)^HforBS = 8等)。