将终端应答字符串读入变量

Bas*_*ass 2 terminal-emulator terminal xterm

使用bash,如何将终端答复读入变量,而无需用户交互?下面的单行还是需要Enter按一次:

echo -ne '\005' && read -s && echo ${REPLY}
Run Code Online (Sandbox Code Playgroud)

另外,我如何配置Xterm以发送有意义的响应^E?到目前为止,我见过的唯一一个发送任何回复的终端模拟器是PuTTY

Tho*_*key 5

可以使用answerbackString资源在 xterm 中配置应答字符串。该资源是在1998年添加的。最初返回“xterm”,自1999 年以来它默认为空字符串,因为一些用户注意到可能会滥用控制序列,这可能会向计算机发送意外命令。

其他终端可能总是返回一个空字符串(konsole、mlterm、vte)。但是 rxvt(和 rxvt-unicode)返回了一个意外的响应:VT102 的设备属性响应(一个转义序列)。 PuTTY 返回“PuTTY”(可能是由于 xterm 的早期影响)。

在快速检查中,Linux 控制台显示“a”(可能是错误)。

由于最初的 VT100 将此作为设置/可配置功能提供,因此仅限于可打印字符。因此,rxvt/urxvt 的响应出乎意料。手册页对此做了一个模糊的评论:

answerbackString: string
指定当 ENQ (control-E) 字符通过时 rxvt-unicode 发送到 shell 的回复。它可能包含转义值,如keysym以下条目中所述。

(没有承诺的描述)。

由于应答字符串的长度未知,读取它的应用程序必须允许等待(以防字符在多个读取操作中到达)。当然还有 ksh/bash 特定的TMOUT功能可以帮助 shell 脚本,以及命令的-t选项read。对于一般用途,我避免使用stty,例如,(参见dynamic.sh):

stty raw -echo min 0 time 5
Run Code Online (Sandbox Code Playgroud)

临时设置终端,以便 aread将在 0.5 秒后超时,并允许它在不读取任何字符的情况下返回。要查看如何保存/恢复设置,阅读脚本会有所帮助。

进一步阅读: