$ timeout 5s python write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr 6 08:12 err
-rw-r--r-- 1 yeti yeti 0 Apr 6 08:12 out
$ timeout 5s python -u write.py > out 2> err
$ ls -l out err
-rw-r--r-- 1 yeti yeti 10 Apr 6 08:13 err
-rw-r--r-- 1 yeti yeti 10 Apr 6 08:13 out
$ cmp err out && echo same
same
$ cat out
0
1
2
3
4
python
usa gravações armazenadas em buffer em stdout
, mas não em stderr
. Então tudo escrito em sys.stderr
é escrito imediatamente, mas o conteúdo de sys.stdout
é mantido em um buffer até que o buffer esteja cheio para minimizar as operações de gravação. Dentro de 5 segundos, o buffer não preenche o suficiente para ser gravado uma única vez e timeout
finaliza o interpretador python
.
Adicionando a opção -u
à invocação de python
, as gravações em stdout
também serão descompactadas.
Você pode forçar o mesmo comportamento para um programa Python definindo a variável de ambiente PYTHONUNBUFFERED
. Para outros programas, você pode usar unbuffer
do expectar ou stdbuf
de GNU coreutils (veja Desativar o buffer no tubo ).