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 (utilisezwait
attendre) program
se terminera (obtenireof
sur son stdin si le shell se termine).