如何确定我的bash终端窗口是否最大化?

时间:2015-02-16 21:25:38

标签: bash terminal

我有一个bash脚本,可以在启动时最大化终端(echo -ne '\e[9;1t'),并在关闭时重置它(echo -ne '\e[9;0t'),当脚本从已经终端启动时很糟糕最大化。我想检测终端是否已经最大化,如果是,则跳过脚本的最大化/重置部分,但是我无法找到我可以检测到终端在bash中最大化的位置。我怎么能这样做?

1 个答案:

答案 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;