如果我使用 bash shell cli 并运行一些不会立即返回的程序,那么我输入一些字母(基本上是在注意到上一个命令未完成之前输入下一个命令)并且输入总是看起来像这样(特别是在使用时向上和向下箭头键:)
]]A^ or ]]B^
我想知道,这种过早的输入无论如何都是“有害的”,或者返回的字符串意味着什么?
答案1
键盘上的某些键与实际字符不对应。例如,A对应于字符a
,但Up和F1键没有自己的专用字符。当按下这些特殊键时,终端不会获取与该键对应的单个字符,而是将按键转换为通常以转义字符开头的多个字符的特殊序列(通常显示为^[
)。例如,Up通常生成序列^[[A
(即来自一个键的 3 个字符:转义符、[
和A
)。
您通常看不到的原因^[[A
是因为大多数控制台应用程序都足够智能,可以将特殊序列转换为有用的命令,而不是仅仅将其回显到控制台。为此,他们关闭终端的内置回显并进行自己的较低级别处理。例如,当bash
看到^[[A
, 时,它意识到这意味着您按下了Up,而不是回显^[[A
,它会执行一大堆操作来删除您到目前为止输入的任何内容,获取历史记录中保存的上一个命令,然后打印它。
如果您^[[A
在按 时看到Up,这通常意味着终端回显已打开,并且前台进程(控制终端的进程)没有执行上述任何特殊处理。这可能是因为应用程序只是忽略终端(就像大多数非交互式命令一样)。请注意,通常情况下,shell 将终端置于规范模式并在运行前台进程之前打开回显,并在命令退出后重新获得对终端的控制权后恢复其自己的设置。
回声似乎相当无害。请记住,如果正在运行的命令不从终端读取,则通过键盘生成的字符可能最终会出现在bash
的输入队列中,因此请小心您键入的内容,因为一旦bash
恢复读取,它们可能会被解释为正常命令从航站楼。
1 这实际上过于简单化了。由于具体顺序可能因终端类型而异,因此控制台应用程序和终端本身之间通常存在多层抽象库。例如,bash
使用readline
库来完成大部分输入。
答案2
这些字符串是您输入的特殊字符的原始表示(例如 home、end、箭头、制表符等)。
它们的有害影响由您正在运行的命令控制,如果它从终端接收输入,这些字符将成为其输入的一部分。
如果它不从终端获取输入,那么它不应该对我所知道的任何 Unix 风格产生任何不利影响。