Tente o seguinte, mas observe que a compatibilidade é bastante limitada. Veja as notas abaixo.
get_title(){(
set -e
ss='stty -g'; trap 'exit 11' INT QUIT TERM; trap 'stty "$ss"' EXIT
e='printf '3''; st='printf '4''; t=
stty -echo -icanon min 0 time "${2:-2}"
printf "${1:-3[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
)}
Exemplo:
$ get_title
$ title='get_title'
Ou, se o stdin do seu script não for o terminal:
$ title='get_title </dev/tty'
O stty
+ dd
kludge tenta garantir que o script não seja bloqueado apenas se o terminal não reportar nada em resposta à saída \e[21t
. Esta (ou melhor) abordagem também pode ser usada com outras seqüências de controle (por exemplo, para obter a posição do cursor).
Notas:
Como o escape \e[21t
é considerado "inseguro", é necessária uma configuração extra para que ele funcione:
Para xterm
: echo '*.vt100.allowWindowOps: true' | xrdb -override
Para urxvt
: echo 'Rxvt.insecure: true' | xrdb -override
Ele não funcionará em todos os terminais baseados em vte como gnome-terminal
, mate-terminal
, xfce4-terminal
, etc, já que eles relatam um fake ("Terminal") ou vazty title em resposta.
mlterm
não precisa de nada especial, mas irá falhar (!) se o título não tiver sido definido antes com \e]2;TITLE\a
.
screen
reportará seu próprio título da janela (aquele que foi definido com a opção -t
ou o comando Ca A , não o título da janela em que está sendo executado.
Está bloqueado e não é suportado em tmux
.