Ich habe dieses Skript gefunden, um meinen aktuellen Terminal-Tab-Titel zu ändern:
#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"
Es funktioniert gut, wenn ich sie direkt im Terminal eingebe ( TITLE="\e]2;HELLO\a"
zum Beispiel mit)
Aber in einem Shell-Skript (rename.sh) ist $PS1 leer und das Skript funktioniert nicht.
rename.sh HELLO gibt aus "Terminal tab title changed to HELLO"
, aber der Terminaltitel wird nicht geändert. Innerhalb des Skripts ist $PS1 leer.
Kann mir jemand helfen, das zu verstehen?
Antwort1
Das Skript funktioniert, indem es die interaktive Eingabeaufforderung der Shell auf eine Zeichenfolge setzt, die Steuercodes zum Ändern des xterm
Fenstertitels enthält. Jedes Mal, wenn die Eingabeaufforderung der Shell angezeigt wird, werden die Steuercodes zum Ändern des Fenstertitels ausgegeben.
Aber natürlich wird innerhalb eines Skripts nie eine interaktive Eingabeaufforderung angezeigt, sodass diese Befehle keine erkennbare Wirkung haben (wenn Sie jedoch innerhalb des Skripts eine andere interaktive Shell starten, können Sie sehen, wie sich der Fenstertitel ändert). Und da kein Skript die Umgebung seines übergeordneten Prozesses ändern kann, geht die Änderung verloren, sobald Ihr Skript beendet wird.
Natürlich könnten Sie die Steuercodes auch direkt aus Ihrem Skript ausdrucken.
printf '\033]2;Hello\a'
Dadurch wird der Fenstertitel einmal geändert, aber wenn ihn später ein anderes Programm erneut ändert, geht Ihr alter Titel verloren. Der Trick zum Ändern Ihrer Eingabeaufforderung ist weit verbreitet, da einige beliebte Programme in der Vergangenheit Ihren Fenstertitel häufig geändert haben, kurz nachdem Sie ihn nach Ihren Wünschen geändert haben (obwohl ich nicht glaube, dass dies heute ein häufiges Problem ist). Der Nachteil besteht darin, dass ein echter Grund, Ihren Fenstertitel zu ändern, nun überschrieben wird, sobald Ihre Shell ihre Eingabeaufforderung erneut anzeigt.
Wenn Sie Code zum Ändern der Eingabeaufforderung Ihrer aktuellen Shell möchten, können Sie diesen nicht in ein normales Skript einfügen. Sie können jedoch source
die Skriptdatei verwenden oder die Befehle stattdessen in eine Shell-Funktion einfügen (dies erfolgt normalerweise in Ihrem Bash-Profil, um dies dauerhaft zu machen).
Übrigens sollte die Bash-Eingabeaufforderung zusätzliche Steuercodes enthalten, um Bash mitzuteilen, wenn ein Teil der Eingabeaufforderung effektiv die Breite Null hat, was die Berechnung der Anzeigebreite der Eingabeaufforderung betrifft. Sie werden feststellen, dass der Zeilenumbruch unregelmäßig ist, wenn Sie beispielsweise einen langen Befehl eingeben und dann die Rücktaste drücken müssen. Bash versucht, die Eingabeaufforderung neu zu zeichnen, tut dies jedoch an der falschen Stelle, da es davon ausgeht, dass die Bildschirmsteuercodes zur Breite der Eingabeaufforderung beitragen. Sie sollten diese \[
und \]
Bash-Steuercodes darum herum hinzufügen.
PS1="$ORIG\[$TITLE\]"
(Die geschweiften Klammern tragen nicht wirklich etwas bei und beeinträchtigen die Lesbarkeit, deshalb habe ich sie entfernt.)
Antwort2
Die Variable PS1
wird nur in der interaktiven Shell verwendet. Um darauf zuzugreifen, müssen Sie Ihr Skript mit starten bash -i rename.sh
.
Minimalbeispiel:
$ echo 'echo $PS1' > test
dann vergleichen
$ bash test
$ bash -i test
Um das Skript direkt als ausführbare Datei auszuführen, fügen Sie der ersten Zeile Folgendes hinzu
#!/bin/bash -i
Beachtendies funktioniert nur, wenn Sie chmod verwenden und das Skript direkt ausführen (z. B. ./rename.sh
), und nicht mit bash rename.sh
, andernfalls müssen Sie es bash -i rename.sh
erneut aufrufen.
Bearbeiten
Um den Terminaltitel direkt zu ändern, können Sie die Steuercodes direkt wiederholen. Versuchen Sie
echo -e '\033]2;SomeTitle\007'
oder innerhalb eines Skripts mit Variablen
title="SomeTitle"
echo -e '\033]2;'$title'\007'