Wie stoppe ich eine Bash-Shell-PS1-Farbe, um am Ende des Befehls anzuhalten?

12

Ich habe eine benutzerdefinierte PS1-Farbe, in der ich die tatsächlichen Shell-Befehle in einer bestimmten Farbe habe, damit ich schnell sehen kann, welche Befehle ich eingegeben habe, und sie von der Befehlsausgabe selbst trennen kann.

Angenommen, die Farbe in PS1 ist für die Eingabeaufforderung auf "Blau" gesetzt und die Standardfarbe in meiner Shell ist Weiß.

  • Ich gebe einen Befehl ein, zB ls, (ls -l ist blau gefärbt)
  • Die Ausgabe, die es erzeugt, erste Zeile ist immer noch blau
  • Alle verbleibenden Zeilen sind weiß

Was ich möchte, ist, dass die gesamte Ausgabe nach dem Befehl 'weiß' ist.

Ein anderes Beispiel:

  • Ich tippe einen Befehl 'Katze', Farbe ist blau
  • Die Ausgabe kommt, die gesamte Ausgabe ist blau

Ich möchte, dass die Ausgabe "weiß" ist, während die Eingabeaufforderung beibehalten wird, die ich "blau" eingegeben habe.

Bei einigen Befehlen ist es in Ordnung, bei anderen Befehlen fließt dieselbe Farbe in die erste Zeile der Ausgabe über, und dann wird die Standardfarbe aktiviert. Bei einigen anderen Befehlen hat die gesamte Ausgabe (z. B. cat) dieselbe Farbe.

Gibt es eine Möglichkeit, nur die Befehle, die ich eingegeben habe, in einer Farbe und den Rest auf der Standardeinstellung zu halten?

Ich bin auf OSX.

EDIT # 1

Hier ist ein Screenshot, auf den @ derobert in den Kommentaren verlinkt ist und der zeigt, wonach ich suche.

                 ss # 1

iQ.
quelle
2
Sie müssen uns Ihre Eingabeaufforderung zeigen, damit wir die Fehler lokalisieren können.
Glenn Jackman

Antworten:

14

Grundsätzlich möchten Sie die Terminalfarbe zurücksetzen, bevor bash den Befehl ausführt. Dies kann mit einem erfolgen trap.

Beispielsweise:

trap '[[ -t 1 ]] && tput sgr0' DEBUG

Bash führt den DEBUGTrap unmittelbar vor dem Befehl aus, sodass tput sgr0vor jedem Befehl (wodurch die Formatierungsattribute zurückgesetzt werden) ausgeführt wird.

Das [[ -t 1 ]]ist eine Sicherheitsprüfung , um sicherzustellen , dass STDOUT ist eigentlich ein Terminal. In einigen Fällen ist STDOUT von bash nicht mit einem Terminal verbunden (Piping, Remote-SSH usw.), sodass Sie keine tputTerminal-Escape-Codes senden möchten .

Patrick
quelle
Wo legst du das hin? Angenommen, PS1 setzt die Farbe nicht zurück. Wie fügen Sie diese Zeile hinzu, um diesen Befehl auszuführen, nachdem der Benutzer seinen Befehl eingegeben und die Eingabetaste gedrückt hat?
Polym
1
@polym in Ihrem .bashrc(oder wo $PS1immer eingestellt ist). Ich würde es direkt neben die $PS1Definition setzen, damit Sie wissen, dass sie verwandt sind.
Patrick
ok wow das funktioniert Gibt es eine Möglichkeit, dass dies schief gehen kann?
Polym
@polym nicht mehr
Patrick
Genial, genau das brauchte ich, um die Terminalfarbe zurückzusetzen.
iQ.