Why does the terminal show "^[[A" "^[[B" "^[[C" "^[[D" when pressing the arrow keys in Ubuntu?

我首先在 Windows 上用 Ansi C 编写了一个小程序,现在我用内置的 GCC 在 Ubuntu 上编译它。

程序很简单:

  • scanf()从控制台读取该行。
  • 分析字符串并计算。

但奇怪的事情发生了,当我试图移动光标时,它会打印出四个字符:

  • Up打印“ ^[[A
  • Dn打印“ ^[[B
  • Rt打印“ ^[[C
  • Lt打印“ ^[[D

  • 怎样才能避免这种情况呢?

  • Why does it print these 4 characters instead of moving the cursor?

114326 次浏览

Because that's what the keyboard actually sends to the PC (more precisely, what the terminal prints for what it actually receives from the keyboard). bash for example gets those values, deciphers them and understands that you want to move around, so it will either move the cursor (in case of left/right) or use its history to fetch previous commands (up/down). So you can't expect your program to magically support arrow keys.

然而 ,从终端读取标准输入已经支持左/右箭头键(我相信,但我现在不在 Linux 中进行测试和确认)。所以我猜还有另一个干扰因素。一个可能的原因是你的一个修改键卡住了?也许是 ALT,CTRL 或者 SUSuper?

对于那些来自 osx (mac)的用户,可以尝试将 shell 更改为 bash

终端-> 首选项-> 用-> [选择]命令(完整路径)打开 shell

然后粘贴

/bin/bash

这可能是因为用户帐户是在 shell 中创建的。

永久的解决办法是-

sudo chsh -s /bin/bash ${username}

要使这个解决方案工作,您必须注销和登录

Temporary solution is everytime when you login into the ubuntu server type bash and hit return.

我觉得简单的办法就是 kill %% 因为这种情况有时是由于后台进程造成的。

对我来说,在 MacOS 终端上取消选择“滚动备用屏幕”就足以让问题消失。参见下面参数设置的截图。enter image description here

如果它在一个码头集装箱下面,运行 /bin/bash。这帮助我解决了问题。

除了 Shahbaz 提到的,我意识到按回车键(因此发送一个空命令)可以解决这个问题。在使用 CTRLC取消命令之后,这通常是必要的。

You can (re)bind keys. Add this at the bottom of your .profile, .zshrc or whatever shell config you have.

bindkey -e
bindkey '\e\e[C' forward-word
bindkey '\e\e[D' backward-word