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

2

Eu encontrei este script para alterar o título da minha guia de 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 os digitar diretamente no terminal (com TITLE="\e]2;HELLO\a" , por exemplo)

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

rename.sh OLÁ gera "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?

    
por MickaelFM 14.04.2017 / 11:33

2 respostas

5

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

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

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

printf '3]2;Hello\a'

Isso altera o título da janela uma vez, mas se qualquer outro programa a alterar posteriormente, seu título antigo será perdido. O truque para alterar o seu prompt é generalizado porque alguns programas populares no passado, muitas vezes mudam o título da janela logo depois que você mudou para o seu gosto (embora eu não acho que isso é um problema comum por mais tempo). A desvantagem é que, se algo tiver um motivo genuíno para alterar o título da sua janela, isso será substituído, assim que seu shell exibir seu prompt novamente.

Se você quiser que o código altere o prompt do seu shell atual, não será possível colocá-lo em um script regular; mas você pode source do arquivo de script ou colocar os comandos em uma função de shell (normalmente feito em seu perfil Bash para torná-lo persistente).

A propósito, o prompt do Bash deve incluir códigos de controle adicionais para informar ao Bash quando uma parte do prompt é efetivamente com largura zero, no que se refere ao cálculo da largura de exibição do prompt. Você descobrirá que o agrupamento de linha é errático se você digitar um comando longo e, em seguida, precisar retroceder, por exemplo; O Bash tentará redesenhar o prompt, mas o fará no lugar errado, porque acha que os códigos de controle de tela contribuem para a largura do prompt. Você desejará adicionar esses códigos de controle \[ e \] Bash ao redor deles.

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

(As chaves realmente não contribuem com nada e dificultam a legibilidade, então eu as tirei.)

    
por 14.04.2017 / 11:53
1

A variável PS1 está 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

compare então

$ bash test
$ bash -i test

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

#!/bin/bash -i

Aviso isso funciona somente se você chmod e executar o script diretamente (por exemplo, ./rename.sh ) e não com bash rename.sh ; caso contrário, você precisará chamar bash -i rename.sh novamente. p>

Editar

Para alterar o título do terminal diretamente, você pode fazer o eco dos códigos de controle diretamente. Experimente

echo -e '3]2;SomeTitle
title="SomeTitle"
echo -e '3]2;'$title'
$ echo 'echo $PS1' > test
7'
7'

ou, dentro de um script, com variáveis

$ bash test
$ bash -i test
    
por 14.04.2017 / 11:57