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

Boo*_*yam 5 linux terminal-emulator window window-title

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

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

小智 3

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

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
)}
Run Code Online (Sandbox Code Playgroud)

例子:

$ get_title
$ title=`get_title`
Run Code Online (Sandbox Code Playgroud)

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

$ title=`get_title </dev/tty`
Run Code Online (Sandbox Code Playgroud)

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