GNU/Linux >> Tutoriels Linux >  >> Linux

Comment ne rien faire pour toujours de manière élégante ?

J'ai un programme qui produit des informations utiles sur stdout mais lit également depuis stdin . Je souhaite rediriger sa sortie standard vers un fichier sans rien fournir sur l'entrée standard. Jusqu'ici, tout va bien :je peux faire :

program > output

et ne rien faire dans le tty.

Cependant, le problème est que je veux le faire en arrière-plan. Si je le fais :

program > output &

le programme sera suspendu ("suspendu (tty input)").

Si je le fais :

program < /dev/null > output &

le programme se termine immédiatement car il atteint EOF.

Il semble que ce dont j'ai besoin est de diriger vers program quelque chose qui ne fait rien pendant un temps indéfini et qui ne lit pas stdin . Les approches suivantes fonctionnent :

while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &

Cependant, tout cela est très laid. Il a être un moyen élégant, en utilisant les utilitaires Unix standard, de "ne rien faire, indéfiniment" (pour paraphraser man true ). Comment pourrais-je y parvenir ? (Mes principaux critères d'élégance ici :pas de fichiers temporaires ; pas d'attente ou de réveils périodiques ; pas d'utilitaires exotiques ; aussi court que possible.)

Réponse acceptée :

Dans les shells qui les supportent (ksh, zsh, bash4), vous pouvez démarrer program en tant que co-processus.

  • ksh :program > output |&
  • zsh , bash :coproc program > output

Cela démarre le program en arrière-plan avec son entrée redirigée depuis un pipe . L'autre extrémité du tuyau est ouverte sur la coque.

Trois avantages de cette approche

  • pas de processus supplémentaire
  • vous pouvez quitter le script lorsque program meurt (utilisez wait attendre)
  • program se terminera (obtenir eof sur son stdin si le shell se termine).

Linux
  1. Comment enregistrer la sortie de la commande dans un fichier sous Linux

  2. Comment trier la sortie par taille ?

  3. Comment rediriger la sortie d'un programme vers un fichier Zip ? ?

  4. Comment un programme décide-t-il d'avoir ou non une sortie colorée ?

  5. Fermer la sortie standard (>&-) ?

Comment faire fonctionner n'importe quel programme avec la commande Tee ?

Guide pratique :Introduction à la programmation - Contrôle de flux

Brilliant Ways sur la façon d'exécuter un programme sous Linux

Comment écrire et exécuter un programme C sous Linux

tcpdump :comment obtenir une sortie grepable ?

Comment puis-je trier la sortie du -h par taille