J'ai un programme qui se ferme automatiquement lors de la lecture d'un EOF dans un flux donné (dans le cas suivant, stdin).
Maintenant, je veux créer un script shell, qui crée un canal nommé et y connecte le stdin du programme. Ensuite, le script écrit plusieurs fois dans le tuyau à l' aide de echo
et cat
(et d'autres outils qui génèrent automatiquement un EOF à leur sortie). Le problème auquel je suis confronté est que, lorsque le premier echo
est terminé, il envoie un EOF au tuyau et fait quitter le programme. Si j'utilise quelque chose comme tail -f
ça, je ne peux pas envoyer d'EOF lorsque j'ai l'intention de quitter le programme. Je recherche une solution équilibrée mais en vain.
J'ai déjà trouvé à la fois comment empêcher les EOF et comment envoyer manuellement un EOF mais je ne peux pas les combiner. Y a-t-il un indice?
#!/bin/sh
mkfifo P
program < P & : # Run in background
# < P tail -n +1 -f | program
echo some stuff > P # Prevent EOF?
cat more_stuff.txt > P # Prevent EOF?
send_eof > P # How can I do this?
# fg
exec 3>P
cause accroche bash, pourquoi?exec 2>P
, et que le mode de trace est activé (set -x
), dans lequel bash va écrire dans le tuyau, mais il n'y a pas de lecteur, donc il bloque l'attente quelque chose à lire.exec 3>P
bloque en bash sur ma machine aussi. C'est parce qu'il n'y a pas de lecture de processusP
. Ainsi, la solution était de permuter les lignesexec 3>P
etprogram < P &
(en ajoutant l'esperluette pour que le programme s'exécute en arrière-plan).Une pipe reçoit EOF lorsque le dernier écrivain s'en va. Pour éviter cela, assurez-vous qu'il y a toujours un écrivain (un processus qui a le canal ouvert pour l'écriture, mais qui n'écrit en fait rien). Pour envoyer l'EOF, faites disparaître cet écrivain de réserve.
la source
Il n'y a aucun moyen pour le programme de faire la distinction entre un EOF qui signifie "il est temps de quitter" et un EOF qui signifie "un écrivain est terminé, mais il peut y avoir plus de contribution de quelqu'un d'autre".
Si vous avez la possibilité de modifier le comportement de votre programme, alors faites la lecture dans une boucle infinie (une itération dure jusqu'à EOF) et envoyez-lui une chaîne de commande spécifique qui signifie "le temps de quitter". L'envoi de cette chaîne serait la tâche de la
send_eof
commande dans votre question.Une autre option:
ou
la source