Cambiar el título de la pestaña del terminal actual dentro de un script de shell

Cambiar el título de la pestaña del terminal actual dentro de un script de shell

Encontré este script para cambiar el título de la pestaña de mi terminal actual:

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

Funciona bien si los escribo directamente en la terminal (con, TITLE="\e]2;HELLO\a"por ejemplo)

Pero dentro de un script de shell (rename.sh), $PS1 está vacío y el script no funciona.

rename.sh HOLA sale "Terminal tab title changed to HELLO" pero el título del terminal no cambia. Dentro del script $PS1 está vacío.

¿Alguien puede ayudarme a entender esto?

Respuesta1

El script funciona configurando el mensaje interactivo del shell en una cadena que incluye códigos de control para manipular el xtermtítulo de la ventana. Cada vez que se muestra el mensaje del shell, se generan los códigos de control para cambiar el título de la ventana.

Pero, por supuesto, dentro de un script, nunca se muestra ningún mensaje interactivo, por lo que estos comandos no tienen ningún efecto observable (aunque si inicia otro shell interactivo desde el script, podría ver el cambio de título de la ventana). Y debido a que ningún script puede cambiar el entorno de su proceso principal, el cambio se pierde una vez que finaliza el script.

De todos modos, desde su script, por supuesto, podría imprimir los códigos de control directamente.

printf '\033]2;Hello\a'

Esto cambia el título de la ventana una vez, pero si algún otro programa lo cambia nuevamente, el título anterior se perderá. El truco para cambiar el mensaje está muy extendido porque algunos programas populares en el pasado a menudo cambiaban el título de la ventana poco después de que lo cambiaste a tu gusto (aunque no creo que este sea un problema común ya). El inconveniente es que si algo tiene una razón genuina para cambiar el título de su ventana, eso ahora será reemplazado tan pronto como su shell muestre su mensaje nuevamente.

Si desea que el código cambie el indicador de su shell actual, no puede colocarlo en un script normal; pero puede usar sourceel archivo de secuencia de comandos o colocar los comandos en una función de shell (comúnmente se hace en su perfil de Bash para hacerlo persistente).

Por cierto, el mensaje de Bash debe incluir códigos de control adicionales para indicarle a Bash cuando una parte del mensaje tiene efectivamente un ancho cero, en lo que respecta al cálculo del ancho de visualización del mensaje. Descubrirá que el ajuste de línea es errático si escribe un comando largo y luego necesita retroceder, por ejemplo; Bash intentará volver a dibujar el mensaje, pero lo hace en el lugar equivocado porque cree que los códigos de control de pantalla contribuyen al ancho del mensaje. Querrá agregar estos \[y \]códigos de control de Bash a su alrededor.

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

(Las llaves en realidad no contribuyen en nada y dificultan la legibilidad, así que las eliminé).

Respuesta2

La variable PS1se utiliza solo en el shell interactivo; para acceder a ella, debe iniciar el script con bash -i rename.sh.

Ejemplo mínimo:

$ echo 'echo $PS1' > test

Entonces compare

$ bash test
$ bash -i test

Para ejecutar el script directamente como ejecutable, agregue lo siguiente a la línea inicial

#!/bin/bash -i

Avisoesto funciona sólo si haces chmod y ejecutas el script directamente (p. ej. ./rename.sh), y no con bash rename.sh, de lo contrario tendrás que bash -i rename.shvolver a llamar.

Editar

Para cambiar el título del terminal directamente, puede repetir los códigos de control directamente. Intentar

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

o, dentro de un script, con variables

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

información relacionada