2015-10-02 3 views
11

Immer wenn ich grep verwende, und ich es zu einem anderen Programm pipe, wird die --color Option nicht respektiert. Ich weiß, dass ich --color=always verwenden könnte, aber es kommt auch mit einigen anderen Befehlen, die ich die genaue Ausgabe dieses Befehls erhalten möchte, als die Ausgabe, die ich erhalten würde, wenn ich in einem tty war.Tun Sie so, als wäre es ein TYY in Bash für irgendeinen Befehl

Also meine Frage ist, ist es möglich, einen Befehl zu glauben, dass der Befehl in einem tty ausgeführt wird?

Zum Beispiel so etwas wie

grep --color word file # Outputs some colors 
grep --color word file | cat # Doesn't output any colors 

Ich möchte in der Lage sein, läuft zu schreiben:

IS_TTY=TRUE grep --color word file | cat # Outputs some colors 

This question scheint ein Werkzeug zu haben, das könnte das tun, was ich will: empty - run processes and applications under pseudo-terminal (PTY), aber von dem, was ich in den Dokumenten lesen konnte, bin ich nicht sicher, dass es für mein Problem helfen kann

+1

Sie erkennen, dass '--color' den tatsächlichen Datenstrom ändert, der an den Befehl weiter unten in der Pipeline gesendet wird? Die Folge wäre, anderen vernünftigen Code zu brechen, weil 'searchTarget' nicht'^[32; 4gsearchTarget^[32; h' (oder ähnlich) ist. Viel Glück. – shellter

+0

Ja, ich weiß, dass ich in meinen Skripten diese Technik niemals verwenden werde, um Greps zu färben, aber einige Befehle, die ich benutze, scheinen etwas anderes auszugeben, wenn sie außerhalb eines TY verwendet werden (zum Beispiel 'ag', der Silversearcher, aber auch Mocha,. ..) und ich habe keine Zeit, alle Optionen zu lernen, um mit dem gleichen Format zu drucken, wenn ich diese Befehle in andere pipe) – edi9999

+0

Hmmm .. Ich denke, das ist mit einigen überraschenden Antworten (mir) zuvor gekommen. Hast du viel nach '[linux] (oder) [bash] --color' gesucht? Viel Glück. – shellter

Antwort

8

Es gibt eine Reihe von Optionen, wie von mehreren anderen Stack Overflow beschrieben Antworten (siehe Caarlos 's comment). Ich werde sie zusammenfassen hier aber:

  1. Verwenden Skript + printf und ein wenig Bash-Funktion machen:

    faketty() { script -qfc "$(printf "%q " "[email protected]")"; } 
    faketty ls --color=auto | cat 
    

    (Kredit geht an diesem answer)

  2. Verwenden Ebene Skript und einige bash Umleitung:

    0<&- script -qfc "ls --color=auto" /dev/null | cat 
    

    http://linux.die.net/man/1/script

  3. Verwenden Sie den unbuffer Befehl (als Teil der Suite von Befehlen erwarten), leider erfordert dies eine große 50MB + installieren:

    sudo apt-get install expect-dev 
    unbuffer -p ls --color=auto | cat 
    

    http://linux.die.net/man/1/unbuffer

Dies ist ein großer Artikel darüber, wie TTYs funktionieren und was Pseudo-TTYs (PTYs) sind, es lohnt sich, einen Blick darauf zu werfen, wenn Sie verstehen wollen, wie die Linux-Shell mit Datei-Deskriptoren arbeitet, um Eingabe, Ausgabe und Signale zu umgehen. http://www.linusakesson.net/programming/tty/index.php

+1

Fügen Sie '-e' zu' script' hinzu, um den Rückgabewert des Befehls zurückzugeben. Denken Sie auch an "weniger - FXur", die Farben anzeigt und nichts tut, wenn die Ausgabe auf einen einzelnen Bildschirm passt (und ein Problem behebt, wenn Sie es haben). –