Por favor, olhe a resposta link , pois é um problema comum. Você poderia usar stdbuff ou unbuffer para o seu programa Ruby também.
Eu escrevi um programa (em Ruby) e funcionou bem. Ele imprime algumas linhas de texto e, em seguida, pausa por um minuto e, em seguida, repete o acima.
Funciona bem (no terminal do Mac OS X), mas notei que se eu quisesse manter um registro da saída, usando
ruby myscript.rb | tee record.txt
então a saída não será mostrada na tela, até que a saída atinja uma certa quantidade, talvez alguns kb. No entanto, isso pode significar 5 ou 10 minutos sem nada na tela (e nada no arquivo, se eu pressionar CTRL-C).
Eu poderia modificar o programa para liberar a saída, mas achei que um aplicativo deveria ser agnóstico quanto ao que está sendo usado com a saída para STDOUT. Então o tee
pode funcionar bem (talvez com uma opção), ou qualquer outro comando pode ser usado, ou talvez seja uma opção do Bash ou do aplicativo Terminal? Existe um caminho?
Por favor, olhe a resposta link , pois é um problema comum. Você poderia usar stdbuff ou unbuffer para o seu programa Ruby também.
I thought an app should be agnostic as to what is being used with the output to STDOUT.
Você pensou errado. As bibliotecas de tempo de execução de várias linguagens de programação, incluindo as linguagens C e C ++, compartilham a semântica de alterar o buffer de acordo com a detecção de que o fluxo está conectado a um dispositivo terminal.
Esta é uma parte definida da linguagem em muitos casos. O padrão da linguagem C diz, por exemplo:
As initially opened, the standard error stream is not fully buffered; the standard input and standard output streams are fully buffered if and only if the stream can be determined not to refer to an interactive device.
A escolha usual se um fluxo não está conectado a um dispositivo terminal é selecionar buffer de unidade, buffer de linha ou buffer total. Buffer de unidade e buffer de linha são usuais para erro padrão; buffer completo para saída padrão. Mas isso varia de acordo com a linguagem.
Portanto, para que a saída não seja totalmente armazenada em buffer quando o fluxo de saída é um canal em tais lanugages, é necessário
stdbuf
se sua linguagem de programação é C ou usa (a parte de fluxos de E / S) a biblioteca de tempo de execução C sua base (que algumas linguagens de programação não); ou ptybandage
que fazem o programa pensar que sua saída padrão é um terminal, enquanto tira essa saída e a envia para a extremidade de gravação do tubo.