我无法在盒子上安装 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
转义被认为是“不安全的”,因此需要额外的配置才能使其工作:
为了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
。
答案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