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

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

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

]]A^ or ]]B^

我想知道,这种过早的输入无论如何都是“有害的”,或者返回的字符串意味着什么?

答案1

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

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

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

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

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

答案2

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

相关内容