Tengo un programa que sale automáticamente al leer un EOF en una secuencia dada (en el siguiente caso, stdin).
Ahora quiero hacer un script de shell, que crea una tubería con nombre y conectar el stdin del programa. Luego, el script escribe en la tubería varias veces usando echo
y cat
(y otras herramientas que generan automáticamente un EOF cuando salen). El problema al que me enfrento es que, cuando echo
se realiza el primero , envía un EOF a la tubería y hace que el programa salga. Si uso algo así tail -f
, no puedo enviar un EOF cuando tengo la intención de salir del programa. Estoy investigando una solución equilibrada pero fue en vano.
Ya he encontrado cómo prevenir EOF y cómo enviar un EOF manualmente, pero no puedo combinarlos. ¿Hay alguna pista?
#!/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
causa aguanta, ¿por qué?exec 2>P
, y tienes activado el modo de rastreo (set -x
), en el que bash va a escribir en la tubería, pero no hay lector, por lo que bloquea la espera algo para leer.exec 3>P
cuelga en mi máquina. Esto se debe a que no hay proceso de lecturaP
. Por lo tanto, la solución fue intercambiar líneasexec 3>P
yprogram < P &
(agregar el ampersand para que el programa se ejecute en segundo plano).Una tubería recibe EOF cuando el último escritor se va. Para evitar esto, asegúrese de que siempre haya un escritor (un proceso que tiene la tubería abierta para escribir, pero en realidad no escribe nada). Para enviar el EOF, haga que ese escritor de reserva se vaya.
fuente
No hay forma de que el programa distinga entre un EOF que significa "es hora de dejar de fumar" y un EOF que significa "un escritor ha terminado, pero puede haber más información de alguien más".
Si tiene la capacidad de modificar el comportamiento de su programa, haga la lectura en un bucle infinito (una iteración dura hasta EOF) y envíele una cadena de comando específica que significa "hora de salir". Enviar esa cadena sería la tarea del
send_eof
comando en su pregunta.Otra opción:
o
fuente