Cosa fa l'interruttore grep --color = auto?


8

Che effetto ha autoun'opzione per lo --colorswitch in grep? Quando grep decide di colorare le stringhe corrispondenti e quando no?

Risposte:


12

Comportamento atteso

Con --color=auto, grep evidenzierà le stringhe corrispondenti se (e solo se) l'output viene scritto direttamente sul terminale e detto terminale è in grado di visualizzare output colorato.

Normalmente, --color=autoè quello che vuoi. Se, ad esempio, usi grep per abbinare un URL e reindirizzarlo a Wget, Wget vedrà \e[1;31mhttp://...invece l'URL effettivo (e si strozzerà).

I seguenti comandi dovrebbero generare un output colorato:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Questo comando, tuttavia, non dovrebbe:

echo Super User | grep --color=auto Super | cat

Qualsiasi incoerenza con questo comportamento deve essere considerata un bug.

Codice sorgente

Con --color=auto, l'ultima versione di Grep per Windows (2.5.4) - così come l'originale 2.5.4 su cui si basa - colora l'output se e solo se la condizione

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

è vero, cioè se e solo se l'output viene scritto su un terminale, la variabile di ambienteTERM viene definita e il terminale non è stupido .

Ciò non produrrà il comportamento desiderato in Windows, poiché TERMnormalmente non è definito. Una soluzione semplice a questo problema è l'impostazione TERM=windowsnel pannello di controllo.

L'ultima versione di grep (2.14) risolve questo problema colorando l'output se e solo se la condizione

isatty(STDOUT_FILENO) && should_colorize()

è vero, dove should_colorize()è definito in modo diverso per POSIX e Win32:

Per il primo, la condizione è equivalente a quella di 2.5.4; per quest'ultimo, la variabile ambientale TERMnon deve essere impostata (semplicemente non può essere dumb).


Come fa a sapere se scrive sul terminale o no?
Trolzen,

1
C'è una funzione C per quello. Se si include il file di intestazione sdgstd.h, viene istty(stdout)restituito 0se l'output viene reindirizzato a un file.
Dennis,

Faccio esperimenti con le porte Windows di grepe lessdal progetto GnuWin (gnuwin32.sourceforge.net). cmd.exeè migliorato con l' ansiconutilità. less --color=autofunziona come previsto: usa il colore quando non viene applicato il reindirizzamento e non quando viene reindirizzato l'output. Ma grep --color=autonon stampa le sequenze di escape in entrambi i casi.
Trolzen,

Non riesco a capire perché questo accada. Pensavo che queste utility avessero lo stesso codice sia nelle versioni unix che Windows e sono piuttosto vecchie. Quindi dovrebbero comportarsi in modo identico.
Trolzen,

Questo è un bug nel grep di GnuWin32 allora. Su Ubuntu, si comporta come ho dettagliato nella mia risposta. Mentre entrambi derivano dallo stesso codice sorgente, ci sono sempre piccoli aggiustamenti che devono essere fatti se si sta per compilare su un'altra piattaforma. Inoltre, tieni presente che l'attuale versione di grep di GnuWin32 è 2.5.4. L'ultima versione su Ubuntu è la 2.12.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.