GNU/Linux >> Linux Esercitazione >  >> Linux

Come far funzionare qualsiasi programma con il comando Tee?

Ho scritto un programma (in Ruby) e ha funzionato bene. Stampa alcune righe di testo, quindi si ferma per un minuto e poi ripete quanto sopra.

Funziona bene (nel terminale di Mac OS X), ma ho notato che se volevo tenere un registro dell'output, usando

ruby myscript.rb | tee record.txt

quindi l'output non verrà mostrato sullo schermo, fino a quando l'output non raggiunge una certa quantità, forse qualche kb. Tuttavia, questo potrebbe significare 5 o 10 minuti senza nulla sullo schermo (e nemmeno nel file se premo CTRL-C).

Potrei modificare il programma per svuotare l'output, ma ho pensato che un'app dovrebbe essere agnostica su ciò che viene utilizzato con l'output su STDOUT. Così può tee essere fatto per funzionare bene (forse con un'opzione), o qualsiasi altro comando potrebbe essere utilizzato, o forse è un'opzione di Bash o dell'app Terminal? C'è un modo?

Risposta accettata:

Ho pensato che un'app dovrebbe essere indipendente da ciò che viene utilizzato con l'output su STDOUT.

Hai pensato male. Le librerie di runtime di diversi linguaggi di programmazione, inclusi i linguaggi C e C++, condividono tutte la semantica della modifica del buffering a seconda che rilevino che lo stream è collegato a un dispositivo terminale.

Questa è una parte definita della lingua in molti casi. Lo standard del linguaggio C dice, ad esempio:

Come inizialmente aperto, il flusso di errore standard non è completamente memorizzato nel buffer; i flussi di input standard e di output standard sono completamente bufferizzati se e solo se è possibile determinare che il flusso non fa riferimento a un dispositivo interattivo.

La scelta usuale se un flusso non è collegato a un dispositivo terminale consiste nel selezionare il buffering dell'unità, il buffering di linea o il buffering completo. Il buffering dell'unità e il buffering della linea sono usuali per l'errore standard; buffering completo per output standard. Ma questo varia in base alla lingua.

Quindi, per fare in modo che l'output non sia completamente bufferizzato quando il flusso di output è una pipe in tali linguaggi devi

  • scrivi il tuo programma su se stesso per rendere la linea di output standard bufferizzata, con buffer intelligente o senza buffer;
  • usa elementi che agganciano la libreria di runtime del tuo particolare linguaggio di programmazione, come stdbuf comando se il tuo linguaggio di programmazione è C o usa (la parte dei flussi di I/O) la libreria di runtime C come base (cosa che alcuni linguaggi di programmazione non fanno); o
  • usa strumenti come ptybandage che fanno pensare al programma che il suo output standard sia un terminale, mentre prende quell'output e lo invia all'estremità di scrittura della pipe.
Correlati:in che modo un programma decide se avere o meno un output colorato?

Ulteriori letture

  • https://unix.stackexchange.com/a/249801/5132

Linux
  1. Come acquisire le sessioni del terminale e l'output con il comando di script Linux

  2. Come fare in modo che Iconv sostituisca il file di input con l'output convertito?

  3. Chiusura dell'output standard (>&-)?

  4. Come funziona il comando Tee?

  5. Come funziona il comando 'ls' in Linux/Unix?

Come utilizzare il comando sleep di Linux con esempi

Come utilizzare il comando tee di Linux

Come utilizzare il comando who in Linux con esempi

Come utilizzare il comando RPM (con esempi)

8 Comando Tee Linux con esempi

Come trovare file con il comando fd in Linux