linux - help - Comment puis-je gzip standard dans un fichier et aussi imprimer standard dans standard?




wc linux (3)

Avoir une bonne tasse de tee !

La commande tee copie l'entrée standard vers la sortie standard et également vers tous les fichiers donnés en arguments. Ceci est utile lorsque vous voulez non seulement envoyer des données dans un tuyau, mais aussi enregistrer une copie

Comme je passe un après-midi tranquille, voici un ascii-art glorieusement illustratif ...

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     file

Comme greyfade le démontre dans une autre réponse, le 'fichier' n'a pas besoin d'être un fichier régulier, mais peut être FIFO vous permettant de rediriger cette sortie vers une troisième commande.

           +-----+                   +---+                  +-----+  
stdin ->   |cmd 1|    -> stdout ->   |tee|   ->  stdout  -> |cmd 2|
           +-----+                   +---+                  +-----+
                                       |
                                       v
                                     FIFO
                                       |
                                       v
                                    +-----+
                                    |cmd 3|
                                    +-----+

Je veux exécuter une commande, avoir la sortie de cette commande get gzip'd à la volée, et aussi echo / tee sur la sortie de cette commande.

c'est-à-dire quelque chose comme:

echo "hey hey, we're the monkees" | gzip --stdout > my_log.gz

Sauf quand la ligne s'exécute, je veux voir ça en standard:

hey hey, we're the monkees

Juste pour poster un moyen qui n'implique pas de toucher le disque:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz)

Une autre façon (en supposant un shell comme bash ou zsh ):

echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz)

La syntaxe >() admise est la suivante:

  • Créer une nouvelle FIFO (généralement quelque chose dans /tmp/ )
  • Exécute la commande inside () et lie la FIFO à stdin sur cette sous-commande
  • Renvoie le nom de fichier FIFO à la ligne de commande.

Quel tee finit par voir, alors, est quelque chose comme:

tee /tmp/arjhaiX4

Tout gzip voit est son entrée standard.

Pour Bash, voir man bash pour plus de détails. C'est dans la section sur la redirection . Pour Zsh, voir man zshexpn sous la rubrique "Process Substitution".

Pour autant que je sache, le Korn Shell, les variantes du classique Bourne Shell (incluant les cendres et les tirets) et le C Shell ne supportent pas cette syntaxe.





tee