Strani simboli sullo schermo quando si utilizza grep?


12

./trans ... output del comando che mostra i codici di escape

Qualche idea di cosa potrebbe causare questo? Senza usare grep, le uniche cose visualizzate sono i codici ISO e lo spazio vuoto.

Software utilizzato

Comando: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

Uscita normale:

output del comando trans con testo e URL leggibili


Incolla l'output invece di allegare un'immagine. In modo che altri possano riutilizzare il comando incollato per riprodurre lo stesso sui loro sistemi.
Thushi,

9
@Thushi In questo caso è appropriato uno screenshot, perché non sarebbero in grado di incollare qui i simboli glifi mancanti.
Sparhawk,

È possibile modificare negli screenshot del comando eseguito senza la greps finale e il risultato di alias grepe type grep?
Michael Homer,

Risposte:


28

Lo screenshot sembra mostrare i codici colore ANSI alterati , che controllano il rendering del testo. Il testo in grassetto / luminoso viene prodotto con la sequenza ␛[1m, che di solito viene interpretata dal terminale e non viene visualizzata direttamente sullo schermo: rende il testo successivo luminoso. Lo screenshot grepdell'output di un ped mostra la differenza di colore tra le etichette e i valori su ogni riga, quindi l'output originale li sta usando.

Sembra che quella sequenza sia stata interrotta dal tuo finale grep, che corrispondeva alla "m" nel codice (poiché è una lettera [a-z]) e ha cercato di evidenziarlo in rosso stesso. Ciò ha lasciato dietro di sé una sequenza di escape parziale, che il terminale non è stato in grado di elaborare.

Il carattere di escape è U + 001B, che è il numero esadecimale visualizzato nelle caselle dei caratteri sconosciuti. Ciò che viene visualizzato è l'escape (la casella), a [, a 1, un rosso mseguito dal testo corrispondente "eng", e lo stesso accade alla fine con "22" (il codice numerico per "colore e intensità normali").


L'output interrotto è davvero:

␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m 

dove ␛[31mrende il testo rosso e lo ␛[22mtrasforma in bianco, entrambi inseriti grepattorno ai mcaratteri nel testo originale. L'originale era solo:

 ␛ [1m eng ␛ [22m 

che è semplicemente " eng" luminoso e quindi tornare al testo normale.

Si potrebbe verificare questo cambiando la finale grepin grep --color=alwayse tubazioni in hexdump, che mostrerà tutti i caratteri non stampabili e quelli interpretati da terminale.


Puoi affrontarlo in alcuni modi. Uno è di usare grepsenza il tuo alias per il momento:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

La barra rovesciata salta temporaneamente l'alias e viene eseguita grepdirettamente.

Un altro è quello di eliminare i codici ANSI dal comando originale, per i quali ci sono alcuni suggerimenti in questa domanda :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

Ancora un'altra opzione è quella di aggiungere un tubo estraneo alla fine:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

Poiché l' grepoutput del finale non è direttamente sul TTY, ma cattramite una pipe, non inserirà l'evidenziazione colorata.

Forse l'opzione migliore è far sì che Translate Shell smetta di usare le sequenze di controllo del terminale nel suo stesso output, in primo luogo quando non è in un terminale. Ciò implicherebbe correttamente una segnalazione di bug da parte dei suoi autori e una correzione di codice per tradurre la ansi()funzione di Shell , ma si può evitare un po ':

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

Questo passa il dumbtipo di terminale nell'ambiente Translate Shell, che riconosce almeno non avere il supporto del colore ECMA-48. (Purtroppo, Shell Shell non utilizza terminfo e collega semplicemente nel proprio codice i tipi di terminale che comprende e le sequenze di controllo che utilizza.)


wow, non sarei mai in grado di eseguire il debug di questo da solo e senza un posto come questo, quindi grazie!
Freedo il

IMO il colpevole potrebbe essere facilmente una variabile rotta GREP_COLORo di GREP_COLORSambiente che contiene sequenze di escape SGR complete, anziché solo i numeri.
egmont,

Caspita, tante soluzioni. Potresti anche aggiungere --color=noal grep finale (o applicarlo TERM=dumb)
Ángel
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.