Linux如何仅用shell脚本获取窗口标题?

Linux如何仅用shell脚本获取窗口标题?

我无法在盒子上安装 screen 或 xproc 等任何工具。我不需要修改标题,我只需要找到窗口标题名称。

echo -e "\033]0;[title]\07";修改我所知道的标题。但我只想知道现有的标题名称。

答案1

尝试以下操作,但请注意兼容性非常有限。请参阅下面的注释。

get_title(){(
        set -e
        ss=`stty -g`; trap 'exit 11' INT QUIT TERM; trap 'stty "$ss"' EXIT
        e=`printf '\033'`; st=`printf '\234'`; t=
        stty -echo -icanon min 0 time "${2:-2}"
        printf "${1:-\033[21t}" > "`tty`"
        while c=`dd bs=1 count=1 2>/dev/null` && [ "$c" ]; do
                t="$t$c"
                case "$t" in
                $e*$e\\|$e*$st)
                        t=${t%$e\\}; t=${t%$st}; printf '%s\n' "${t#$e\][lL]}";
                        exit 0;;
                $e*);;
                *) break;;
                esac
        done
        printf %s "$t"; exit 1
)}

例子:

$ get_title
$ title=`get_title`

或者,如果您的脚本的标准输入不是终端:

$ title=`get_title </dev/tty`

stty+ kludgedd尝试确保如果终端没有报告任何响应转义的内容,脚本不会被阻止\e[21t。这种(或更好的)方法也可以与其他控制序列一起使用(例如获取光标位置)。

笔记:

由于\e[21t转义被认为是“不安全的”,因此需要额外的配置才能使其工作:

为了xtermecho '*.vt100.allowWindowOps: true' | xrdb -override

为了urxvtecho 'Rxvt.insecure: true' | xrdb -override

它会根本不起作用在基于 vte 的终端中,例如gnome-terminalmate-terminalxfce4-terminal等,因为它们报告伪造的(“终端”)或空的响应中的标题。

mlterm不需要任何特殊的东西,但是如果之前没有设置标题\e]2;TITLE\a(该错误是固定的在当前的资源中)。

screen-t将报告它自己的窗口标题(使用选项或命令设置的窗口标题C-a A,而不是它正在运行的窗口的标题。

它已被阻止且不受支持tmux

答案2

例如,获取konsole当前交互bash实例正在运行的窗口的标题:

#!/bin/bash

get_title() {

    local pid=$$
    local pids=`pstree -lpsT $pid | tr '-' '\n' | tac | xargs | grep -oE '[0-9]+'`

    for pid in $pids
    do
        local wid=`xdotool search --pid $pid`
        if [ ! -z "${wid}" ]
        then
            echo `xdotool getwindowname $wid`
            exit
        fi
    done
}

get_title

相关内容