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