退格键在运行的 bash 脚本中不起作用

退格键在运行的 bash 脚本中不起作用

我正在运行非常简单的脚本,它逐行读取并将输入的行打印回终端:

while read CMD; do
    echo $CMD
done

它工作正常,但是当我尝试编辑带有backspace字符的行时,它会打印^?而不是删除字符。当我按Ctrl+时backspace,输出是^H。如何修复此行为,以便backspace删除字符而不是添加这些字符?我尝试了stty erase '^?'命令,但没有成功。

答案1

问题是,有很多种方式来表示退格键,但命令read并不理解所有方式。您应该能够← Backspace在终端仿真器的设置中配置按下该键时具体发送什么。

假设你正在使用gnome-terminal模拟器,打开编辑菜单并点击个人资料偏好. 切换到兼容性选项卡,您将获得以下选项:

gnome-terminal → 配置文件首选项 → 兼容性

现在你可以改变退格键生成:设置。您有以下五个选项可供选择。我在括号中添加了它们在我的系统上的行为:

  • 自动(工作)
  • Control-H(^H改为打印)
  • ASCII DEL(默认,有效)
  • 转义序列(^[[3~改为打印)
  • TTY 擦除(有效)

答案2

我在 Gnome-Terminal 中使用 bash 时遇到了同样的问题。

请注意,在命令行上,退格键按预期工作,但是当我的程序(一个基于 TCP 套接字的简单聊天客户端)从 stdin 读取时,backspace会打印字符(回显到屏幕)^?而不是删除最后一个字符。

用于# stty icanon允许“规范(熟)模式”。请参阅此处的一些解释https://unix.stackexchange.com/questions/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

关于我的问题/解决方案的更多背景信息:我遇到了一个问题,需要粘贴超过 4k 个字符。在研究过程中,我被引导到上面的链接。我曾经# stty -icanon禁用过 4k 限制,但失去了使用退格键(擦除)的能力。

相关内容