Como fazer qualquer programa funcionar com o comando tee?

1

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 太極者無極而生 28.11.2017 / 11:24

2 respostas

2

Por favor, olhe a resposta link , pois é um problema comum. Você poderia usar stdbuff ou unbuffer para o seu programa Ruby também.

    
por 28.11.2017 / 11:36
1

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

  • escreva seu programa para si mesmo tornando a linha de saída padrão em buffer, com buffer inteligente ou sem buffer;
  • usa coisas que engancham a biblioteca de tempo de execução de sua linguagem de programação, como o comando 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
  • use ferramentas como 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.

Leitura adicional

por 28.11.2017 / 12:18