Output Terminal.app errato per linee lunghe con schede

6

Quando eseguo il seguente comando in Terminal.app:

echo -e "a\tb\tc\td\te\tf\tg\tyo"

Dovrei ottenere il seguente risultato (usando una finestra a 40 colonne in modo che le righe non si sovrappongano qui e sostituendo le schede con spazi in modo che qui venga mostrata la corretta quantità di spazio):

a       b       c       d       e       
f       g       yo

Invece, ottengo questo risultato:

a       b       c       d       e       y
o

Come puoi vedere, mancano f e g .

Dopo aver provato varie stringhe, penso che il problema è che una scheda alla fine di una riga non fa avanzare l'output alla riga successiva, ma lascia il cursore di output di un carattere prima della fine della riga. Ad esempio (assumendo ancora un terminale a 40 colonne), 4 schede posiziona il cursore sulla posizione 32 della riga 1. Un'altra scheda dovrebbe posizionare il cursore sulla posizione 0 della linea 2, ma il cursore si trova nella posizione 39 della linea 1, lasciando spazio per un altro carattere da stampare, e anche a quel punto, il cursore non è avanzato alla riga successiva, quindi un'altra scheda ci riporterà in posizione 39. Quindi, un numero illimitato di stringhe (single-character + tab) sarà silenziosamente ignorato.

Ho sperimentato una varietà di:

  • shell (compresi bash , sh e csh )
  • larghezze del terminale (incluse 40 colonne, 80 e molte altre)
  • tipi di terminale (compresi vt100 e xterm-color )
  • codifiche dei caratteri del terminale (compresi UTF-8 e ascii )
  • impostazioni del terminale (incluso Escape non-ASCII input )

Inoltre, un amico ha eseguito comandi simili su un sistema Linux con un terminale diverso e non ha riscontrato lo stesso bug.

Qualcuno sa come risolvere questo problema? Sarei molto grato, dato che questo bug sta rendendo difficile il debug di alcuni script di shell fatti in casa su file separati da tabulazioni.

    
posta Jeff Terrell Ph.D. 28.11.2012 - 22:04
fonte

1 risposta

1

Questo ha a che fare con le interruzioni di riga. Terminal sta cercando uno spazio, o una sequenza di caratteri continua per fare un'interruzione di riga. In questo caso la prima opportunità che vede per rompere la linea è tra la y e la o. La "y" è mostrata perché l'ultimo carattere di una linea estesa è mostrato nell'ultimo posto per suggerire all'utente che qualcosa sta accadendo lì.

Soluzioni alternative ...

Potresti provare:

echo -e "a \tb \tc \td \te \tf \tg \tyo"

e tutto apparirà come ti aspetteresti.

anche qualcosa di simile

echo -e "ab\tcd\tef\tgh\tij\tkl\tmn\tyo"

dovrebbe rompere tra "k" e "l"

Ancora questo è un comportamento strano e che vale sicuramente un rapporto bug / radar

    
risposta data 21.02.2013 - 13:52
fonte

Leggi altre domande sui tag