Como evitar o comando de término para enviar EOF para pipes nomeados?

3

O problema que enfrentei é exatamente este: link

I want to be able to run a program which takes stdin, and write data to it whenever I feel like it. I can do this with fifo named pipes. e.g.:

txtplay < named_pipe.fifo

echo "Hello World" > named_pipe.fifo

     

No entanto, isso tem a desvantagem de o primeiro comando sair   depois que o segundo terminar. O que eu quero é o mesmo que:

     

txtplay

     

em vigor, para que eu possa inserir meus dados sempre que quiser e não me preocupar   sobre isso ver o fim do arquivo. Infelizmente, não posso simplesmente fazer isso, como eu   deseja que os dados sejam enviados para que sejam processados através de um filtro antes do   programa vê isso.

     

Por que não carrego o programa toda vez que quero enviar dados para   isto? Muito devagar.

     

O que eu quero, basicamente, é redirecionar a saída de um   determinado comando para um pipe nomeado fifo, sem o fim-de-arquivo. Enquanto estou no   como funciona esse negócio de EOF? Existe um comando "EOF" especial ou é   quando não são recebidos mais dados, ou quando o programa original emite   os dados saem?

Existe alguma solução para isso?

    
por justhalf 09.06.2014 / 11:46

2 respostas

4

Execute todos os seus comandos em um sub-shell (ou em bash, entre parênteses) e redirecione a subshell para o pipe nomeado.

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

E para responder à pergunta EOF, o EOF é escrito quando o identificador de arquivo é fechado. Se você redirecionar de um programa, você obtém EOF quando esse programa (echo, nesse caso) é finalizado. Ao encapsular vários comandos entre parênteses, você recebe apenas um EOF quando o parêntese de fechamento é atingido.

    
por 09.06.2014 / 17:09
1

Se você mantiver uma alça aberta para o pipe, ela não será fechada por cada comando de 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 important 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 você remover essa instrução exec, notará que a função trava no segundo eco, pois o Zenity pára quando vê EOF do primeiro eco.

    
por 11.11.2016 / 11:49

Tags