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?
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
.
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
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