Ler o pipe nomeado uma vez sempre que a entrada for escrita

4

Eu preciso escrever um programa bash que executa comandos ecoados em um pipe nomeado que ele lê, mas não consigo fazê-lo funcionar somente quando um comando é enviado. Ele continua repetindo o último comando até que um novo seja escrito.

Isto é:

  1. Executar ./read_pipe.sh
  2. Aguarda até que um comando seja ecoado para pipe e o leia.
  3. Executa o comando uma vez. < - o que não funciona. Ele continua executando para sempre.
  4. Repita a partir do passo 2.

Meu read_pipe.sh

#!/bin/bash
pipe="mypipe"
if [ ! -p $pipe ]; then
  echo 'Creating pipe'
  mkfifo $pipe
fi

while true
do
  if read line <$pipe; then
    COMMAND=$(cat $pipe)
    echo "Running $COMMAND ..."
    # sh -c $COMMAND
  fi
done

Se eu cat "echo 'Hello World'" > mypipe a saída é sempre assim:

Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
Running "echo 'Hello World'" ...
...

Como posso executar o comando uma vez e esperar por outro comando ecoado?

    
por Pedro Adame Vergara 06.06.2017 / 09:29

2 respostas

4

Uma maneira de fazer isso:

#! /usr/bin/env bash
pipe=/path/to/pipe
[ -p "$pipe" ] || mkfifo -m 0600 "$pipe" || exit 1
while :; do
    while read -r cmd; do
        if [ "$cmd" ]; then
            printf 'Running %s ...\n' "$cmd"
            # sh -c "$cmd" sh
        fi
    done <"$pipe"
done

Provavelmente é uma péssima ideia descomentar a linha sh .

    
por 06.06.2017 / 10:00
5

No seu caso, você pode simplesmente:

tail -f $pipe | sh & 

não há necessidade de loops.

    
por 06.06.2017 / 11:38

Tags