GNOME Terminal - Prozessname im Tab-Titel

9

Wie kann ich den aktuellen Namen des laufenden Prozesses in einen GNOME-Terminal-Tabulatortitel (oder eine Titelleiste, wenn nur eine Registerkarte vorhanden ist) einfügen?

- UPDATE -

Zur Verdeutlichung möchte ich, dass der Tabulatortitel aktualisiert wird, wenn ich einen Prozess ausführe, zum Beispiel:

# title is currently "bash"
$ find / -name foo # while searching for foo, title is "find"
$ # title is once again "bash"
$ less /proc/cpuinfo # title changes to "less"
$ man ls # title changes to man
$ # title returns to "bash"
Reinheit
quelle

Antworten:

8

Fand es. Diese Seite bietet eine gute Erklärung für eine Lösung.
In Ihrem Bashrc würde es so aussehen:

case "$TERM" in
xterm*|rxvt*)
    set -o functrace
    trap 'echo -ne "\e]0;$BASH_COMMAND\007"' DEBUG
    PS1="\e]0;\s\007$PS1"
    ;;
*)
    ;;
esac

Persönlich glaube ich nicht, dass ich es zu meinem Bashrc hinzufügen würde, da der DEBUG in Kombination mit Trace eine Menge Müll wegwirft, wenn Ihre gesamte Shell startet. Wenn Sie damit leben können, funktioniert es tatsächlich. Es wird jedoch der gesamte Befehl angezeigt, nicht nur das erste Wort.

DaveParillo
quelle
2
Vielen Dank für eine gute Frage. Das sah zunächst nach einer einfachen Frage aus ... Nach den ersten 10 Minuten fing es an, mich verrückt zu machen! Deshalb dachte ich, es sei eine gute Frage - klingt einfach, zwang mich aber, etwas tieferes über die Interaktion zwischen der Hülle, dem Terminal und den Signalen zu lernen.
DaveParillo
warum die PS1Zuordnung? es führt zu Glibberish für mich, und es scheint hier nicht wirklich notwendig zu sein ...?
Phil294
Nur Fehler für mich.
Kzqai
4

Nun, da jeder die Lösung von David Pashley bereits zu kennen scheint, bin ich etwas überrascht, dass ich so lange gebraucht habe, um diese zu finden, weil sie fast so alt ist.

Diese Lösung kümmert sich tatsächlich um Bash-Completion-Spam-Müll.

Um es klar zu sagen: Ich habe hier nichts alleine gemacht als recherchiert. Alle Kredite gehen an Marius Gedminas .

Dies funktioniert perfekt für mich mit Gnome-Terminal / Terminator

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

    # Show the currently running command in the terminal title:
    # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
    show_command_in_title_bar()
    {
        case "$BASH_COMMAND" in
            *\033]0*)
                # The command is trying to set the title bar as well;
                # this is most likely the execution of $PROMPT_COMMAND.
                # In any case nested escapes confuse the terminal, so don't
                # output them.
                ;;
            *)
                echo -ne "\033]0;${USER}@${HOSTNAME}: ${BASH_COMMAND}\007"
                ;;
        esac
    }
    trap show_command_in_title_bar DEBUG
    ;;
*)
    ;;
esac

Auch dies ist ein Cross-Post, weil ich gerade davon erfahren habe und teilen wollte und ich denke, dass es auch hier nützlich ist.

Gemeinschaft
quelle
2

Das Folgende sollte funktionieren. Ich habe die Funktion in einer .bash_functionsDatei und quelle sie in der .bashrcDatei vor dem Einstellen $PROMPT_COMMAND.

function term_title
{
        history 1 | awk '{print $2}';
}

PROMPT_COMMAND='echo -ne "\033]0;"$(term_title)"\007"'

quelle
1
Du bist nah dran, aber ich habe nicht viel besseres. Dies gibt Ihnen den zuletzt ausgeführten Befehl, aber nicht wirklich, wonach Adurity sucht. Ich dachte nur, term_title in zu ändern: `if [jobs]; dann Geschichte 1 | awk '{print $ 2}'; Andernfalls würde echo -ne 'bash em' fi` funktionieren, aber es ist inkonsistent, Prozesse mit kurzer Lebensdauer abzufangen, und es schaltet immer noch nicht zurück, wenn der Prozess abgeschlossen ist. Ich weiß nicht, wie xterm funktioniert, um zu wissen, wie man mit diesen Auslösern / Ereignissen umgeht.
DaveParillo
bash führt $ PROMPT_COMMAND kurz vor dem Anzeigen der Eingabeaufforderung aus. Dies ist also das Beste, was ich mit diesem Ansatz tun kann. Möglicherweise gibt es andere Trigger, die direkt nach dem Drücken der Eingabetaste ausgeführt werden können, aber ich kenne sie nicht.
2

in zsh definieren Sie einfach Ihre 'precmd'-Funktion. siehe hier .

Akira
quelle