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


8

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

while read CMD; do
    echo $CMD
done

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


请注意16.10上个月已达到其支持周期的结尾。您应该尽快升级到17.04。
字节指挥官

1
我建议更换read CMDread -e CMD
赛勒斯(Cyrus)

1
尝试terminator代替gnome-terminal。其工作正常
Severus Tux

1
@whtyger这适用于此脚本。在我的实际情况下,我从程序中输入了内容,但不调用read。我没有机会更改程序脚本,这只是代表我的问题的一个示例。是否有全局设置可以对所有输入进行此配置?
vrom911 '17

1
@Cyrus我的Backspace可以按我的需要工作-始终删除最后一个字符,即使对于这个脚本也可以不加-e选择地删除它。但是在@ vrom911的机器上不是这样。我想知道为什么会发生这种情况以及可以在哪里进行配置。
Shersh

Answers:


6

问题在于,有许多种方式来表示退格键,但是read命令不能完全理解它们。您应该能够配置← Backspace在终端仿真器设置中按键时发送的确切内容。

假设您使用的gnome-terminal是模拟器,请打开“ 编辑”菜单,然后点击“ 个人资料”偏好设置。切换到“ 兼容性”选项卡,您应该获得以下选项:

gnome-terminal→概要文件首选项→兼容性

现在,您可以更改Backspace键的generate:设置。您可以从以下五个选项中进行选择。我在括号中添加了它们在系统中的行为:

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

目前,我有ASCII DEL。我已经尝试了所有5个选项,但是都没有解决此问题。
vrom911

真奇怪 你能告诉我type read说什么以及什么shell /版本$SHELL --version报告吗?
字节指挥官

我知道这很奇怪。我试图用谷歌搜索很多问题,但没有找到适合我的解决方案。type readread is a shell builtin。并$SHELL --versionGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911

1

我在Gnome终端中使用bash遇到了同样的问题。

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

使用# stty icanon让“规范(熟)模式”。在此处查看一些说明/unix/131105/how-to-read-over-k-4input-without-new-lines-on-a-terminal

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.