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.
Ulteriori letture
- https://unix.stackexchange.com/a/249801/5132