Bootham Deyyam Asked: 2018-11-13 07:25:57 +0800 CST2018-11-13 07:25:57 +0800 CST 2018-11-13 07:25:57 +0800 CST Linux如何仅使用shell脚本获取窗口标题? 772 我无法在盒子上安装任何工具,如 screen 或 xproc。我不需要修改标题,我只需要找到窗口标题名称。 echo -e "\033]0;[title]\07";修改我知道的标题。但我只想知道现有的标题名称。 linux terminal-emulator 1 个回答 Voted Best Answer mosvy 2018-11-20T10:18:39+08:002018-11-20T10:18:39+08:00 请尝试以下操作,但请注意兼容性非常有限。请参阅下面的注释。 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+ ddkludge 试图确保如果终端没有报告任何内容以响应\e[21t转义,脚本不会阻塞。这种(或更好的)方法也可以与其他控制序列一起使用(例如,获取光标位置)。 笔记: 由于\e[21t逃逸被认为是“不安全的”,因此需要额外的配置才能使其工作: 对于xterm:echo '*.vt100.allowWindowOps: true' | xrdb -override 对于urxvt:echo 'Rxvt.insecure: true' | xrdb -override 它在基于 vte 的终端(如、、等)中根本不起作用,因为它们会报告虚假(“终端”)或空标题作为响应。gnome-terminalmate-terminalxfce4-terminal mlterm不需要任何特别的东西,但如果之前没有设置标题,它会崩溃(!)\e]2;TITLE\a(该错误已在当前来源中修复)。 screen将报告它自己的窗口标题(使用-t选项或C-a A命令设置的标题,而不是正在运行的窗口的标题。 它被阻止并且在tmux.
请尝试以下操作,但请注意兼容性非常有限。请参阅下面的注释。
例子:
或者,如果您的脚本的标准输入不是终端:
stty
+dd
kludge 试图确保如果终端没有报告任何内容以响应\e[21t
转义,脚本不会阻塞。这种(或更好的)方法也可以与其他控制序列一起使用(例如,获取光标位置)。笔记:
由于
\e[21t
逃逸被认为是“不安全的”,因此需要额外的配置才能使其工作:对于
xterm
:echo '*.vt100.allowWindowOps: true' | xrdb -override
对于
urxvt
:echo 'Rxvt.insecure: true' | xrdb -override
它在基于 vte 的终端(如、、等)中根本不起作用,因为它们会报告虚假(“终端”)或空标题作为响应。
gnome-terminal
mate-terminal
xfce4-terminal
mlterm
不需要任何特别的东西,但如果之前没有设置标题,它会崩溃(!)\e]2;TITLE\a
(该错误已在当前来源中修复)。screen
将报告它自己的窗口标题(使用-t
选项或C-a A命令设置的标题,而不是正在运行的窗口的标题。它被阻止并且在
tmux
.