正在运行的脚本显示奇怪符号时的命令行输入

U2r*_*ros 8 command-line terminal special-characters

如果我使用 bash shell cli 并运行一些不会立即返回的程序,那么我输入了一些字母(基本上是在注意到前一个命令没有完成之前输入下一个命令)并且输入总是看起来像这样(尤其是在使用时上下箭头键:)

]]A^ or ]]B^
Run Code Online (Sandbox Code Playgroud)

我想知道,这种过早的输入是否“有害”,或者返回的字符串是什么意思?

jw0*_*013 13

键盘上的某些键与实际字符不对应。例如,A对应于字符aUpF1键没有自己的专用字符。当按下这些特殊键时,终端不会获得与该键对应的单个字符,而是将按键转换为多个字符的特殊序列,这些字符通常以转义字符开头(通常显示为^[)。例如,Up通常生成序列^[[A(即一个键的 3 个字符:escape [、 和A)。

您通常看不到的原因^[[A是因为大多数控制台应用程序足够智能,可以将特殊序列转换为有用的命令,而不仅仅是将其回显到控制台。为此,他们关闭终端的内置回显并进行自己的低级处理。例如,当bash看到^[[A,¹时,它意识到这意味着你按下了Up而不是回声^[[A,它会做很多事情来删除你到目前为止输入的任何内容,获取保存在历史记录中的上一个命令,然后打印出来。

如果您^[[A在按下 时看到Up,这通常意味着终端回显已打开,并且前台进程(控制终端的进程)未执行上述任何特殊处理。这可能是因为应用程序只是忽略了终端(就像大多数非交互式命令一样)。请注意,通常情况下,shell 会将终端置于规范模式并在运行前台进程之前打开回显,并在命令退出后重新获得对终端的控制后恢复自己的设置。

回声似乎相当无害。请记住,如果正在运行的命令没有从终端读取,则您通过键盘生成的字符可能最终会出现在bash的输入队列中,因此请注意您键入的内容,因为一旦bash恢复读取,它们可能会被解释为正常命令从终端。

¹ 这实际上过于简单化了。由于具体的顺序可能因终端类型而异,因此控制台应用程序和终端本身之间通常有多层抽象库。例如,bash使用readline库来完成它的大部分输入。


Did*_*hen 8

这些字符串是您输入的特殊字符的原始表示(如 home、end、箭头、tab 等...)。
它们的有害影响由您正在运行的命令控制,如果它从终端接收输入,这些字符将成为其输入的一部分。
如果它不接受来自终端的输入,它应该不会对我所知道的任何 Unix 风格产生任何不利影响。