2015-10-02 29 views
11

Ogni volta che utilizzo grep e lo reindirizzo ad un altro programma, l'opzione --color non viene rispettata. So che potrei usare --color=always, ma ha anche alcuni altri comandi che vorrei ottenere l'output esatto di quel comando come l'output che otterrei se fossi in una tty.Fingere di essere un tty in bash per qualsiasi comando

Quindi la mia domanda è, è possibile ingannare un comando nel pensare che il comando sia eseguito all'interno di un tty?

Ad esempio, l'esecuzione

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

mi piacerebbe essere in grado di scrivere qualcosa di simile:

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

This question sembra avere uno strumento che potrebbe fare quello che voglio: empty - run processes and applications under pseudo-terminal (PTY), ma da quello che ho potuto leggere nei documenti, non sono sicuro che possa essere d'aiuto per il mio problema

+1

ti rendi conto che '--color' cambia il flusso di dati effettivo che viene inviato al comando più in basso nella pipeline? La conseguenza sarebbe la rottura di un altro codice ragionevole perché "searchTarget" non è "^ [32; 4gsearchTarget^[32; h' (o simile). In bocca al lupo. – shellter

+0

Sì, mi rendo conto che nei miei script non userò mai quella tecnica per colorare greps, ma alcuni comandi che uso sembrano produrre qualcosa di diverso quando vengono usati al di fuori di una tty (ad esempio 'ag', silversearcher, ma anche mocha ,. ..) e non ho il tempo di imparare tutte le opzioni per stampare con lo stesso formato ogni volta che inserisco questi comandi in altri) – edi9999

+0

Hmmm .. Penso che questo sia venuto fuori prima con alcune risposte sorprendenti (per me). Hai cercato molto per '[linux] (o) [bash] --color'? In bocca al lupo. – shellter

risposta

8

Ci sono un certo numero di opzioni, come delineato da diversi altri Overflow dello stack risposte (vedere Caarlos's comment). Cercherò di riassumere qui però:

  1. Utilizza script + printf e fare un po 'di funzione di bash:

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

    (merito va a questo answer)

  2. Utilizza script semplice e un po' reindirizzamento bash:

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

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

  3. utilizzare il comando unbuffer (come parte della suite si aspettano di comandi), purtroppo questo richiede un grande 50mb + installazione:

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

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

Questo è un grande articolo su come Gli TTY funzionano e quali sono gli Pseudo-TTY (PTY), vale la pena dare un'occhiata se si vuole capire come la shell di Linux funziona con i descrittori di file per passare in input, output e segnali. http://www.linusakesson.net/programming/tty/index.php

+1

Aggiungi '-e' a' script' per restituire il valore restituito del comando. Inoltre, considera il piping con 'less -FXur' che visualizzerà i colori e non farà nulla se l'output si adatta a un singolo schermo (e risolve un problema \ r se ce l'hai). –