Come prevenire il command di terminazione per submit EOF a pipes denominati?

Il problema che ho affrontato è esattamente questo: http://www.linuxmisc.com/4-linux/d7863c256bccbfb6.htm

Voglio essere in grado di eseguire un programma che prende stdin e scrivi i dati each volta che mi sento. Posso farlo con i tubi di tipo fifo. per esempio:

txtplay < named_pipe.fifo

echo "Hello World" > named_pipe.fifo

Tuttavia, questo ha lo svantaggio del primo command che esce dopo che il secondo è finito. Quello che voglio è lo stesso:

txtplay

in effetti, quindi posso solo inserire i miei dati each volta che mi piace, e non preoccuparti di vedere file finali. Purtroppo, non posso semplicemente farlo, perché voglio che i dati siano inviati ad esso per essere elaborati attraverso un filter prima che il programma lo veda.

Perché non caricare il programma each volta che voglio submit dati ad esso? Troppo lento.

Quello che voglio, in fondo, è un modo per redirect l'output di un dato command ad un pipe denominato fifo, senza il file finale. Mentre sono a questo punto, come funziona questo business EOF? C'è un command speciale "EOF" o quando non viene ricevuto più dati o quando il programma originale che emette i dati esce?

C'è una soluzione per questo?

Esegui tutti i tuoi comandi in un sotto-shell (o in bash, all'interno delle parentesi) e reindirizza la sottoscheda al pipe denominato.

 ( # some stuff echo "foo" # some other stuff echo "bar" # end of my commands ) > /home/foo/bar/named_pipe 

E per rispondere alla domanda EOF, EOF viene scritto quando la lima di file si chiude. Se si reindirizza da un programma, si ottiene EOF quando il programma (eco, in questo caso) termina. Incapsulando più comandi in parentesi, si ottiene solo un EOF quando viene raggiunta la parentesi vicina.

Se mantieni una maniglia aperta al pipe, non verrà chiusa da each command eco.

 #!/usr/bin/env bash fifo_with_exec() { echo "fifo_with_exec" readonly TMP_PIPE=$(mktemp -u) mkfifo -m 600 ${TMP_PIPE} echo "pipe created: ${TMP_PIPE}" # Here is the importnt bit exec 9<> ${TMP_PIPE} zenity --progress --no-cancel < ${TMP_PIPE} & zenity_pid=$! echo "zenity_pid: ${zenity_pid}" echo "0" > ${TMP_PIPE} echo "#Run command A" > ${TMP_PIPE} echo "output of command A" sleep 2 echo "40" > ${TMP_PIPE} echo "#Run command B" > ${TMP_PIPE} echo "output of command B" sleep 2 echo "80" > ${TMP_PIPE} echo "#Run command C" > ${TMP_PIPE} echo "output of command C" sleep 0.5 echo "100" > ${TMP_PIPE} } fifo_with_exec 

Se si rimuove tale istruzione exec si noterà che la function appende alla seconda eco, come Zenity si ferma quando vede EOF dalla prima eco.