Wie kann man die Farbe von STDOUT und STDERR dauerhaft in Grau ändern?

7

Diese Frage ähnelt der Frage Kann ich meine Shell so konfigurieren, dass STDERR und STDOUT in verschiedenen Farben gedruckt werden?

Ich suche jedoch nach einer Lösung, mit der ich sowohl STDOUT als auch STDERR in EINE Farbe ändern kann . Ich versuche nicht, für STDOUT und STDERR unterschiedliche Farben festzulegen, da dies problematisch ist und Probleme verursachen kann, die in der Antwort über den obigen Link erwähnt werden.

Ich entschuldige mich, da ich nicht viel über Unix und Linux weiß. Ich suche nach einer Lösung, die es mir ermöglicht, ein paar Zeilen zu meinem .bashrcoder hinzuzufügen .bash_profileund die Farbe von STDOUT und STDERR dauerhaft zu ändern.

user1769197
quelle
Du meinst nur was von Programmen gedruckt wird oder? Oder möchten Sie nur die Standardfarbe des gesamten Texts ändern, einschließlich der von Ihnen eingegebenen Befehle?
Terdon
nur was von Programmen gedruckt wird (dh Python, Java-Ausgabe ...), ausgenommen die Befehle, die ich
eingebe
Sie können versuchen, das Terminal auf etwas einzustellen, das keine Farbe unterstützt. Dies sind Anweisungen, wie man festgelegt , dass auf OS X .
Bratchley

Antworten:

8

STDOUT und STDERR haben keine Farben. Was Farbe hat, ist Ihr Terminal (Emulator); Es ist jeweils ein Vordergrund (und eine Hintergrundfarbe) eingestellt.

Es sollte auch beachtet werden, dass STDOUT und STDERR nicht singulär sind - sie sind pro Prozessausgabestreams . Es gibt kein globales STDOUT, das für alle Programme gilt. Diese Streams werden an Ihr Terminal weitergeleitet, sind jedoch für jeden Prozess unterschiedlich.

Terminalemulatoren haben normalerweise Möglichkeiten, die Palette über ein Menü festzulegen , sodass der Standardvordergrund (angewendet auf Daten, die sowohl über STDOUT- als auch über STDERR-Streams empfangen werden ) beliebig sein kann. Sie können auch gelten ANSI - Farbcodes in Ihrem prompten und wenn Sie nicht die Farbe zurückgesetzt Sie mit \[\033[0m\]am Ende, wird es weiterhin anzuwenden. Beachten Sie, dass einige Anwendungen diese verwenden und zurücksetzen. Dies ist daher keine sehr ideale Methode, da beim Zurücksetzen die Standardeinstellungen des Terminals wiederhergestellt werden.

Wenn Sie den Terminal-Vordergrund nicht einstellen möchten, können Sie STDOUT / STDERR pro Prozess filtern. siehe die Vorschläge hier .

Goldlöckchen
quelle
Können Sie mir also einen Code schreiben, bei dem STDOUT und STDERR jedes Mal, wenn ich ein Python-Skript ausführe, grau angezeigt werden? Ich möchte, dass dies dauerhaft ist, etwas, das ich nur zu meinem hinzufüge .bashrc .
user1769197
@ user1769197, es ist im Allgemeinen keine gute Idee, mit der Ausgabe von Programmen herumzuspielen, da sie möglicherweise eigene Farbsequenzen ausgeben, was unordentlich werden würde. Außerdem ist das Erkennen von Java / Python / etc-Programmen unzuverlässig, da einige von Wrappern in anderen Sprachen (normalerweise Shell-Skripten) aufgerufen werden. Ihre sicherste und einfachste Möglichkeit besteht darin, die Standardfarben für fg / bg in Ihrer Terminalanwendung wie von Goldlöckchen empfohlen zu konfigurieren.
ArielCo
Wie sollte ich also den Standardvorder- und -hintergrund in meiner Terminalanwendung so konfigurieren, dass JEDES MAL, wenn ich ein Python-Skript ausführe, die Ausgabe in einer anderen Farbe angezeigt wird und nach der Ausführung zur Standardfarbe fg / bg zurückkehrt? Ist dies etwas, das ich gerade zum .bashrcSkript hinzufüge und der Effekt wird dauerhaft sein?
user1769197
Ist dies etwas, das ich gerade zum .bashrc-Skript hinzufüge und der Effekt dauerhaft ist? Nein, es gibt keine solche Möglichkeit, dass WRT speziell auf Python-Skripte usw. abzielt. Dies wäre eine nicht vorhandene Funktion von Python. Sie können jedoch ein kurzes Shell-Skript verwenden, das die Farbe festlegt und dann Ihren Befehl ausführt. Einstellen der Farbe erfordert echoing ANSI - Escape - Codes erwähnt in verschiedenen Links und Antworten (und ein Intro hier , aber auch hier aufpassen , dass was auch immer Sie diese außer Kraft laufen kann).
Goldlöckchen
7

Mit zshAnschlüssen, die 16 Farben oder mehr à la unterstützen xterm:

preexec() printf '\e[90m' # set foreground color to grey before running
                          # the command

precmd() printf '\e[m' # reset the foreground color before issuing the
                       # next prompt.

Beachten Sie, dass Befehle die Vordergrundfarbe des Terminals selbst ändern können.

Stéphane Chazelas
quelle
Ich habe deinen Code auf meinen gesetzt .bashrc. Aber nichts passiert. Warum passiert dies ?
user1769197
2
@ user1769197, .bashrcist für die bashShell. Diese Lösung ist für zsh.
Stéphane Chazelas
1
Siehe dort für eine bashgleichwertige, aber da Sie auf OS sind / X, gibt es keinen Grund , warum Sie nicht verwenden , zshda sie standardmäßig installiert werden soll (es verwendet auch die System - Shell , dort zu sein).
Stéphane Chazelas
1

Dies scheint eine Frage mit dem XY-Problem zu sein - es ist nicht das Richtige, um die gewünschte Lösung zu finden:

Angenommen, die Ausgabe ist farbig und der leere Teil des Bildschirms hat eine andere Farbe oder ist mit einem Zeichen gefüllt.

Überlegen Sie, wie die Ausgabe für diese Fälle aussehen soll:

Eine leere Zeile? Zeilen, die nur mit Leerzeichen gefüllt sind? Zeilen mit nur einem Leerzeichen ? Mit einem Tab? Mit einem Leerzeichen und einer Registerkarte? Mit einer Registerkarte und einem Leerzeichen? Ja, sie sehen alle unterschiedlich aus !

Oder möchten Sie, dass eine leere Zeile aussieht - nur eine leere Zeile ?
Wenn dies der Fall ist, möchten Sie die Ausgabestreams nicht wirklich färben, und diese Antwort gilt .


Ich werde einen ähnlichen Ansatz für die Lösung von @ StéphaneChazelas geben, aber "invers":

Sie können , technisch gesehen , Farbe STDOUT und STDERR, Zeile für Zeile , mit dem Hinzufügen der richtigen Codes Farbe Flucht zu Beginn und Ende der Leitung auf beiden Strömen.

Sie müssten darauf achten, die Farbe mindestens jeder Zeile zurückzusetzen, da sonst jedes Programm, das Farbe verwendet, Ihr Terminal durcheinander bringenls würde . Sie haben einfach nicht viel Kontrolle über die Ausgabefarbe - daher ist es schwierig, bestenfalls das Richtige zu finden.

Aber: Sie haben die Kontrolle über alle anderen verwendeten Farben, oder?
Und Sie brauchen in diesem Fall nur eine Farbe? Großartig!

Stellen Sie die Standardfarbe der Terminals auf die Farbe STDOUT / STDERR ein und färben Sie den Rest wie gewünscht.

Sie können Ihre Shell-Eingabeaufforderung einfärben - und den Eingabeaufforderungscode verwenden, um auch andere Teile einzufärben.
Zugegeben, es ist etwas schwierig, die Befehlszeile zu färben , in der Sie Ihren Befehl bearbeiten, aber es ist sicherlich möglich. Aber versuchen Sie das nicht mit, bashwenn Sie es verwenden können zsh, da der Code für die Eingabeaufforderung dort viel flexibler ist - das ist es, was Sie brauchen.

Stellen Sie nun die Standardvordergrundfarbe Ihres Terminals auf Grau und möglicherweise auf Hintergrund ein - versuchen Sie jedoch, diese als transparent / undefiniert zu belassen.

Um die Hintergrundfarbe der Befehlszeile festzulegen, sehen Sie sich dieses Beispiel unter Ändern der Hintergrundfarbe der Befehlszeile in zsh an, wenn ich das Eingabeaufforderungsthema ändere :

PROMPT="%{$bg[cyan]%}%{$fg[red]%}%n%{$reset_color%}%{$bg[cyan]%}@%{$fg[red]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%{$bg[cyan]%}%% "

Beispiel für eine Shell-Eingabeaufforderung

(Der schwierige Teil besteht darin, die nicht verwendeten Endabschnitte der Lins in verschiedenen Situationen richtig zu machen.)

Volker Siegel
quelle