Usando um select dentro de um tempo lido não está me dando o resultado que eu quero

1

Eu tenho um arquivo "in" que contém:

a
b
c

Eu corro o seguinte comando:

cat in | while read el; do select yn in "yes" "no"; do echo $yn; done; done;

E obtenha a seguinte saída:

1) yes
2) no
#?
#? 
#? 

O que eu quero é poder digitar 1 ou 2 em cada iteração. O que preciso fazer de diferente para fazer isso funcionar?

    
por Noah Campbell 24.12.2009 / 01:56

2 respostas

1

Você está inserindo a tubulação em um loop while. Dentro do loop, stdin vem do comando anterior , não do console. Sua instrução select está lendo o mesmo canal do qual a instrução read está lendo.

Além disso, você não precisa de cat .

Você precisa preservar stdin para usar na instrução select. Tente isto:

while read el; do select yn in "yes" "no"; do echo $yn; break; 
done <&4; done 4<&0 < in

Primeiro, observe que estamos redirecionando a entrada usando '<', em vez de usar cat .

Isto preserva sua origem stdin (fd 0) em fd 4 e, em seguida, dentro do loop redireciona a entrada para select do fd 4.

    
por 24.12.2009 / 03:02
0

select lerá uma entrada e a executará repetidamente até EOF; o que você quase certamente quer é o superficialmente similar:

cat in | while read el; do select yn in "yes" "no"; do echo $yn; break; done; done
    
por 24.12.2009 / 02:26

Tags