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


8

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

]]A^ or ]]B^

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


1
这不是bash特有的,我将删除该标签。
Didi Kohen

Answers:


8

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


13

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

通常看不到的原因^[[A是因为大多数控制台应用程序都足够聪明,可以将特殊序列转换为有用的命令,而不仅仅是将其回显到控制台。为此,他们关闭了终端的内置回显,并进行了自己的下层处理。例如,当bash看到时^[[A,¹便意识到这意味着您按下了按钮Up而不是回显^[[A,它执行了大量工作来删除您到目前为止所键入的内容,取回历史记录中保存的先前命令,然后打印该命令。

如果看到^[[A当按下Up,即通常意味着终端回送被接通和前台进程(一个在终端的控制)是没有做上述任何特殊的处理。这可能是因为应用程序只是忽略了终端(就像大多数非交互式命令一样)。请注意,通常,外壳程序将终端置于规范模式,并在运行前台进程之前打开回显,并在退出命令后重新获得终端的控制权后,便会恢复其自身的设置。

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

¹这实际上是一个过分的简化。由于特定序列可能会因终端类型而异,因此在控制台应用程序和终端本身之间通常存在多层抽象库。例如,bash使用该readline库执行其大部分输入。


1
根据我对问题的了解,这里的情况是在执行另一条命令期间,而不是在进程退出与bash恢复终端设置之前的短暂时间内。不过,我确实赞成您的答案,因为它详细解释了案件,与我的答案不同,我的答案是绝对最低的答案。
Didi Kohen

@DavidKohen我认为您对原始问题是正确的。我对该命令做了一些调整,以说明该命令何时仍在运行。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.