gpt4 book ai didi

bash - 读取发送到 xterm 的控制字符串的答案

转载 作者:行者123 更新时间:2023-12-05 03:07:17 27 4
gpt4 key购买 nike

在 xterm 中运行的交互式程序可以向 xterm 发送控制代码,这会导致 xterm 通过发回一个答案来响应。我想阅读答案。有几个这样的控制代码,所以为了便于讨论,让我们坚持使用控制序列 ESC Z,它会导致 xterm 发回其终端 ID。例如,当我在我的 shell 中输入时(我使用的是 Zsh,但据我所知,这也适用于 bash)

echo -e '\eZ'

我在终端缓冲区中看到字符串

63;1;2;4;6;9;15;22;29c

并听到哔声(因为从 xterm 发送的答案也包含不可打印的字符,特别是它还包含一个 ESC)。我的目标是以某种方式将此字符串 63;1;2;4;6;9;15;22;29c 读入 shell 变量。 我主要使用 Zsh,但也欢迎使用 bash 解决方案(或任何其他脚本语言,例如 Ruby、Perl 或 Python)

我的第一次尝试非常简单:

#!/bin/zsh
echo -e '\eZ'
read -rs -k 25
echo $REPLY | xxd

这是有效的,因为我发现(经过一些反复试验)我的特定 xterm 上的这个特定示例中的应答字符串的长度为 25 个字符。在一般情况下,当然,我事先并不知道确切的长度,所以我想要一个更灵活的解决方案。我的想法是一次读取一个字符,直到什么都没有为止,我编写了以下程序来测试我的想法:

#!/bin/zsh
str=''
echo -e '\eZ'
while :
do
read -rs -t -k
if [[ -z $REPLY ]]
then
echo '(all read)'
break
fi
str="${str}$REPLY"

完成 echo $海峡 | xxd

但是,这不会读取任何内容。回复总是空的。

我还尝试了变体 read -rs -t -k 1(效果相同)和 read -rs -k 1(永远挂起)。甚至 read -rs k 25 也不再起作用,所以我猜罪魁祸首是 while 循环,而不是 read 命令。但是,如果我想一次读取一个字符的应答字符串,我确实需要一个循环。

有人可以解释一下为什么我的方法失败了,我该如何解决我的问题?

最佳答案

您可以直接从终端读取 read-statement,例如,

read -rs -t -k < $(tty)

解决 shell 的重定向问题。

关于bash - 读取发送到 xterm 的控制字符串的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com