Altere o título da guia do terminal atual dentro de um script de shell

Altere o título da guia do terminal atual dentro de um script de shell

Encontrei este script para alterar o título da guia do meu terminal atual:

#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"

Funciona bem se eu digitá-los diretamente no terminal ( TITLE="\e]2;HELLO\a"por exemplo)

Mas dentro de um script de shell (rename.sh) $PS1 está vazio e o script não funciona.

rename.sh HELLO sai "Terminal tab title changed to HELLO" , mas o título do terminal não é alterado. Dentro do script $PS1 está vazio.

Alguém pode me ajudar a entender isso?

Responder1

O script funciona definindo o prompt interativo do shell como uma string que inclui códigos de controle para manipular o xtermtítulo da janela. Cada vez que o prompt do shell é exibido, os códigos de controle para alterar o título da janela são exibidos.

Mas é claro, dentro de um script, nenhum prompt interativo é exibido, então esses comandos não têm efeito observável (embora se você iniciasse outro shell interativo a partir do script, você poderia ver a mudança no título da janela). E como nenhum script pode alterar o ambiente de seu processo pai, a alteração será perdida quando o script terminar.

De qualquer forma, a partir do seu script, você poderia imprimir os códigos de controle diretamente.

printf '\033]2;Hello\a'

Isso altera o título da janela uma vez, mas se qualquer outro programa o alterar novamente posteriormente, o título antigo será perdido. O truque para alterar o prompt é difundido porque alguns programas populares no passado costumavam alterar o título da janela logo após você alterá-lo de acordo com sua preferência (embora eu não ache que esse seja mais um problema comum). A desvantagem é que se algo tiver um motivo genuíno para alterar o título da janela, isso será substituído assim que o shell exibir o prompt novamente.

Se você deseja que o código altere o prompt do seu shell atual, você não pode colocá-lo em um script normal; mas você pode usar sourceo arquivo de script ou colocar os comandos em uma função shell (geralmente feito em seu perfil Bash para torná-lo persistente).

Aliás, o prompt do Bash deve incluir códigos de controle adicionais para informar ao Bash quando uma parte do prompt tem largura efetivamente zero, no que diz respeito ao cálculo da largura de exibição do prompt. Você descobrirá que a quebra de linha é errática se você digitar um comando longo e precisar retroceder, por exemplo; O Bash tentará redesenhar o prompt, mas o fará no lugar errado, porque acredita que os códigos de controle da tela contribuem para a largura do prompt. Você desejará adicionar esses \[códigos \]de controle do Bash ao redor deles.

PS1="$ORIG\[$TITLE\]"

(As chaves não estão realmente contribuindo com nada e dificultam a legibilidade, então eu as retirei.)

Responder2

A variável PS1está sendo usada apenas no shell interativo, para acessá-la você precisa iniciar seu script com bash -i rename.sh.

Exemplo mínimo:

$ echo 'echo $PS1' > test

então compare

$ bash test
$ bash -i test

Para executar o script diretamente como um executável, adicione o seguinte à linha inicial

#!/bin/bash -i

Perceberisso funciona apenas se você chmod e executar o script diretamente (por exemplo ./rename.sh), e não com bash rename.sh, caso contrário, você terá que ligar bash -i rename.shnovamente.

Editar

Para alterar o título do terminal diretamente, você pode repetir os códigos de controle diretamente. Tentar

echo -e '\033]2;SomeTitle\007'

ou, dentro de um script, com variáveis

title="SomeTitle"
echo -e '\033]2;'$title'\007'

informação relacionada