Terminal paste inaffidabile

5

Sto cercando di incollare il testo in Terminal (v2.5 build 343, sto usando Yosemite), e sembra omettere in modo coerente i caratteri.

Ad esempio se copio il seguente testo su pasteboard:

1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890

Quindi in Finder Modifica - > Mostra appunti Posso verificare che il testo sia tutto lì.

Quindi apro Terminale e digito:

cat > test

Quindi incolla il testo sopra e premi Ctrl + d .

Sullo schermo ottengo questo:

1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
1234567890,12345678,1234567890,1234567890,1234567890
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890

ma il contenuto del file "test" corrisponde al testo originale che ho copiato nel tavolo di montaggio.

C'è qualche motivo per cui Terminal potrebbe rilasciare caratteri quando viene visualizzato sullo schermo durante un'operazione di incolla?

    
posta nonagon 16.11.2014 - 02:25
fonte

1 risposta

3

Lo stdout in questo caso è bufferato dalla linea ed è 1024 byte che sta causando il troncamento dell'output sul display. Quando si incolla dagli appunti, i caratteri New-Line (EOL) non stampabili alla fine di ogni riga vengono semplicemente contati come un altro carattere sulla linea fino al conteggio del buffer. Il motivo per cui la matematica non si sommerà per il punto in cui si verifica il troncamento che @ miken32 stava cercando di calcolare, è perché non stai contando i caratteri New-Line.

Se esegui il cat test del file utilizzando l'opzione -e, puoi visualizzare i caratteri EOL non stampabili come $, includendoli nel calcolo matematico.

$ cat -e test
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$
1234567890,1234567890,1234567890,1234567890,1234567890,1234567890$

È possibile aggirare il buffer di riga con i byte incollati se si specifica il proprio marcatore di fine del file (EOF) nel comando cat. In questo modo, quando il comando cat rileva i caratteri EOL, ripristina il buffer di riga all'inizio di ogni nuova riga invece di contarli come un altro byte in un flusso continuo perché il comando cat sta analizzando ogni nuova riga cercando la stringa EOF su una linea da sola per sapere quando uscire.

Puoi fare qualcosa di simile a questo:

cat << EOF > test

Lo stdin reindirizzamento (< < EOF) dice a cat di continuare a stampare finché non incontra l'input corrispondente ai caratteri di fine file specificati su una nuova riga da soli. In questo modo, stdout stamperà quindi ogni carattere stampabile incollato riga per riga, l'inconveniente è che ottieni un carattere ">" nell'output all'inizio di ogni nuova riga.

$ cat << EOF > test
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> 1234567890,1234567890,1234567890,1234567890,1234567890,1234567890
> EOF

L'indicatore di fine file viene letteralmente digitato come i caratteri E, O, F, dopo l'incolla e può essere qualsiasi cosa tu voglia. Anche i caratteri EOF e il > i caratteri non sono inclusi nell'output reindirizzato inviato al file. Digitando le lettere come EOF è solo simbolico e può essere qualsiasi cosa tu voglia, XXX per esempio, devi solo essere sicuro che quello che mai l'indicatore EOF che hai specificato non appare nel buffer di pasta.

Per la cronaca, puoi sempre usare ^ D come marcatore EOF quando usi lo stdin, anche se specifichi qualcos'altro. L'uso della stringa EOF è una convenzione di scripting vecchia scuola per delimitare un blocco di testo da reindirizzare all'interno dello script.

Spero che questo aiuti.

    
risposta data 31.03.2015 - 01:52
fonte

Leggi altre domande sui tag