web-dev-qa-db-fra.com

Comment rendre la sortie d'une commande Shell sans tampon?

Existe-t-il un moyen d'exécuter des commandes Shell sans tampon de sortie?

Par exemple, hexdump file | ./my_script ne transmettra l'entrée de hexdump à my_script que dans des blocs tamponnés, pas ligne par ligne.

En fait, je veux connaître une solution générale comment rendre une commande sans tampon?

59
bodacydo

AFAIK, vous ne pouvez pas le faire sans de vilains hacks. L'écriture dans un canal (ou sa lecture) active automatiquement la mise en mémoire tampon complète et vous ne pouvez rien y faire : . La "mise en mémoire tampon de ligne" (ce que vous voulez) n'est utilisée que lors de la lecture/écriture d'un terminal. Les hacks laids font exactement cela: ils connectent un programme à un pseudo-terminal, de sorte que les autres outils du canal lisent/écrivent à partir de ce terminal en mode tampon de ligne. L'ensemble du problème est décrit ici:

La page contient également quelques suggestions (les "hacks laids" susmentionnés) que faire, c'est-à-dire en utilisant unbuffer ou en tirant quelques astuces avec LD_PRELOAD.

19
Nordic Mainframe

Essayez stdbuf, inclus dans GNU coreutils et donc pratiquement n'importe quelle distribution Linux. Cela définit la longueur du tampon pour l'entrée, la sortie et l'erreur à zéro:

stdbuf -i0 -o0 -e0 command
116
jpatokal

La commande unbuffer du package expect désactive la mise en mémoire tampon de sortie:
buntu Manpage: unbuffer - sortie de la mémoire tampon

Exemple d'utilisation:

unbuffer hexdump file | ./my_script

Vous pouvez également utiliser la commande script pour rendre la sortie de hexdump mise en mémoire tampon de ligne (hexdump sera exécutée dans un pseudo terminal qui incite hexdump à réfléchir son écriture sa sortie standard à un terminal, et non à un tuyau).

# cf. http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe/
stty -echo -onlcr
script -q /dev/null hexdump file | ./my_script         # FreeBSD, Mac OS X
script -q -c "hexdump file" /dev/null | ./my_script    # Linux
stty echo onlcr
18
vroc