Não é verdade, não. O buffer é configurado por processo por meio de uma chamada setbuf(3)
, na qual as linguagens de script oferecem vários graus de controle (TCL: completo, Perl | Python | Ruby: incompleto, Shell: de maneira nenhuma). Você precisaria usar um wrapper que falsifica um terminal (unbuffer, expect, tmux) ou tentar patch de macaco de chamada de sistema não suportável ( stdbuf
) para tentar influenciar como a saída é feita ou para adicionar código a cada aplicativo a saída pode ser configurada para ser unbuffered, line buffered ou block buffered (ou qualquer subconjunto daqueles que a linguagem oferece, se houver). Alguns aplicativos já terão sinalizadores para isso, por exemplo -l
de tcpdump
, ou não é difícil adicionar esse código:
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
GetOptions( 'l' => \my $Flag_Unbuffer ) or exit 64;
STDOUT->autoflush(1) if $Flag_Unbuffer;
print "hi\n" for 1..4;
sleep 10;
se isso for salvo como lflag
e tornado executável, a diferença de comportamento poderá ser observada executando:
$ ./lflag | cat
ou
$ ./lflag -l | cat