Escrevi um programa (em Ruby) e funcionou bem. Ele imprime algumas linhas de texto, faz uma pausa por um minuto e repete o procedimento acima.
Funciona bem (no terminal do Mac OS X), mas observei 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 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 pode tee
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? Há algum caminho?
Responder1
Achei que um aplicativo deveria ser agnóstico quanto ao que está sendo usado com a saída para STDOUT.
Você pensou errado. As bibliotecas de tempo de execução de diversas linguagens de programação, incluindo as linguagens C e C++, compartilham a semântica de alteração do buffer de acordo com a detecção de que o fluxo está anexado a um dispositivo terminal.
Esta é uma parte definida da linguagem em muitos casos. O padrão da linguagem C diz, por exemplo:
Quando aberto inicialmente, o fluxo de erros padrão não é totalmente armazenado em buffer; os fluxos de entrada padrão e de saída padrão são totalmente armazenados em buffer se, e somente se, for possível determinar que o fluxo não se refere a um dispositivo interativo.
A escolha usual se um fluxo não estiver conectado a um dispositivo terminal é selecionar buffer unitário, buffer de linha ou buffer completo. O buffer de unidade e o buffer de linha são comuns para erro padrão; buffer completo para saída padrão. Mas isso varia de acordo com o idioma.
Portanto, para que a saída não seja totalmente armazenada em buffer quando o fluxo de saída for um canal em tais idiomas, você deve
- escreva seu programa para si mesmo e torne a linha de saída padrão com buffer, buffer inteligente ou sem buffer;
- use coisas que conectem a biblioteca de tempo de execução da sua linguagem de programação específica, como o
stdbuf
comandosesua linguagem de programação é C ou usa (os fluxos de E/S fazem parte) a biblioteca de tempo de execução C como base (o que algumas linguagens de programação não fazem); ou - usar ferramentas como
ptybandage
essas fazem o programa pensar que sua saída padrão é um terminal, enquanto pega essa saída e a envia para a extremidade de gravação do canal.
Leitura adicional
Responder2
Por favor, olhe a respostahttps://stackoverflow.com/a/11337109/5656721pois é um problema comum. Você poderia usarstdbuffouremover bufferpara o seu programa Ruby também.