Como evitar que o script engula todos os stdin?

3

Eu tenho um script que lê de um pipe em um loop e executa um script de espera e um script de shell normal no loop. Ambos os scripts executam o ssh em outro servidor para pegar um pedaço de dados. Por exemplo:

cat /tmp/file |
while read a b c d
do
   s='expect-script server1 $b'
   c='ssh $b normal-script'
   echo $s $c
done

Embora existam muitas linhas em / tmp / file, o script é encerrado após o processamento da primeira linha. Eu suspeito que o script de espera está engolindo todos os stdin para que quando ele retorna, não há mais nada para ler. Como posso evitar isso? Eu não quero nenhum dos scripts que eu chamo para ler a partir do stdin do script principal.

    
por Justin 21.06.2014 / 04:43

2 respostas

2

cat /tmp/file |
while read a b c d
do
    {
        s='expect-script server1 $b'
        c='ssh $b normal-script'
        echo $s $c
    } < /dev/null
done

A sintaxe { command... } permite que você aplique o redirecionamento ou a tubulação a uma sequência de comandos.

Também observarei que você não precisa de cat no seu exemplo. Você poderia fazer isso:

while read a b c d
do
    ...
done < /tmp/file
    
por 23.06.2014 / 15:52
2

Na verdade, é ssh que está sugando stdin. Basta adicionar a opção -n :

    c=$( ssh -n $b normal-script )

Se você não quiser fazer isso, você pode ter seu laço while do shell lido de um descritor de arquivo diferente, deixando o stdin intacto:

while read -u3 a b c d
do
    s=$( expect-script server1 $b )
    c=$( ssh $b normal-script )
    echo $s $c
done 3< /tmp/file

(assumindo o bash / ksh / zsh para a opção read -u )

    
por 23.06.2014 / 16:30