我有一个bash脚本,可以在启动时最大化终端(echo -ne '\e[9;1t'
),并在关闭时重置它(echo -ne '\e[9;0t'
),当脚本从已经终端启动时很糟糕最大化。我想检测终端是否已经最大化,如果是,则跳过脚本的最大化/重置部分,但是我无法找到我可以检测到终端在bash中最大化的位置。我怎么能这样做?
答案 0 :(得分:1)
同一组转义序列(请参阅Window manipulation (from dtterm, as well as extensions)
Ps = 1 1 -> Report xterm window state. If the xterm window
is open (non-iconified), it returns CSI 1 t . If the xterm
window is iconified, it returns CSI 2 t .
在此上下文中,您的“\ e [”是“CSI”。例如,使用bash的“read -t”,您可以阅读响应。
从评论中,我提醒说问题是最大化,并建议可以使用代码18和19。但是,由于窗口装饰(标题/边框),18的结果无法与19的结果相匹配。在讨论中,bash的“读取-t”出现了问题 - 我认为这不是一个好的推荐(似乎bash修改了stty模式)。下面是一个示例,它将读取给定的响应,而不尝试使用“read -t”:
#!/bin/bash
get_reply() {
TTY=$(tty)
exec </dev/tty
OLD=$(stty -g)
stty raw -echo min 0 time 5 2>/dev/null
printf '\033[%st' "$*" >/dev/tty
read reply
stty $OLD 2>/dev/null
exec < $TTY
content=$(echo ".$reply" | sed -e 's/^.[//' -e 's/t$//')
echo "REPLY:$content"
echo "$reply" |od -bc
}
get_size() {
get_reply "$1"
content=$(echo ".$content" | sed -e "s/^.$2;//")
echo "...$content"
}
if printf '\033]0;%s\007' "Testing" >/dev/tty
then
get_reply 11
if [ $content = 1 ]
then
get_size 18 8
get_size 19 9
else
echo "** iconified"
fi
else
echo "? not a tty" >&2
exit 1
fi
因为解决方案必须简单地读取原始大小并保存(在某处),所以有更简单的方法来读取大小。例如,stty和resize程序更容易提供信息:
$ stty -a |head -n 1
speed 38400 baud; rows 40; columns 80; line = 0;
和
$ resize -u
COLUMNS=80;
LINES=40;
export COLUMNS LINES;