Usando uma entrada de arquivo como stdin para um script de shell não funciona

0

Eu tenho o seguinte código de script:

test.sh

echo "BEGIN"
while read CMD <&1; do
    [ -z "$CMD" ] && continue
    case "$CMD" in
    start)
            echo "get_start"
            ;;
    stop)
            echo "get_stop"
            ;;
    *)
            echo "get_uknown_command"
            ;;
    esac
    echo "END";
done

Quando eu executo com:

$./test.sh <input.txt

Eu pego meu script bloqueado

input.txt

start
stop
sthh

Por que meu script está bloqueado? Como posso consertar isso?

BTW: Se eu inserir os dados manualmente, o script não será bloqueado.

    
por Mohamed KALLEL 12.07.2013 / 12:50

2 respostas

3

Você está usando o descritor de arquivos incorreto. 1 é stdout, 0 é stdin.

Alterar:

while read CMD <&1; do

para:

while read CMD <&0; do

E será do arquivo corretamente. No entanto, você não precisa fazer tudo isso, já que read usa o padrão stdin:

while read CMD; do

Além disso, a opção -u pode ser usada para ler um descritor de arquivo específico (pelo menos no bash). Então você pode fazer isso também:

while read -u 0 CMD; do
    
por 12.07.2013 / 13:29
2

Descritor de arquivo 1 é stdout ou saída padrão . O que significa que você está redirecionando a entrada de read para a saída padrão . Isso claramente não vai funcionar muito bem; quase certamente nunca haverá nenhuma entrada aguardando a saída padrão para read .

A entrada padrão é o descritor de arquivo 0 , portanto, se você alterar <&1 para <&0 na linha 2 do script, funcionará. Ou simplesmente abandone essa parte; read lê a entrada padrão por padrão (que é praticamente o seu propósito), então não há necessidade de explicitamente dizer para ler a partir da entrada padrão.

Se você quiser ler alguma entrada em particular de forma interativa e permitir que o restante seja redirecionado de um arquivo (ou de um pipe), você pode fazer read </dev/tty .

E você não precisa do separador de instrução ponto-e-vírgula após o eco END; a nova linha faz muito bem.

    
por 12.07.2013 / 13:27