entrada do usuário não aceita na instrução de caso aninhado

0

Estou tentando criar uma instrução de caso aninhada na qual a entrada do usuário é esperada (S / N). No entanto, o sistema nunca espera pela entrada e vai sempre para a terceira opção, "Por favor, responda sim ou não". Alguém pode me dizer o que eu estou sentindo falta?

Aqui está a declaração do caso

 #!/bin/bash

SERVSTAT=/mnt/support/scripts/log/serverstatus.txt
FUSE_PATH=/home/jet/instances/
LOG=data/log/karaf.log
echo " " >  $SERVSTAT
STATUS=status

find /etc/init.d/* -name '*service' -print0 | while IFS= read -r -d '' FILE;
do
if [ "$FILE" != "." -o "$FILE" != ".." ]; then
APP_NAME='echo ${FILE:12} | sed 's/-service//''
        OUTPUT=$($FILE $STATUS)
case "$OUTPUT" in
    *not* )
        echo "Do you wish to start $APP_NAME ?"
        read  yn
        case $yn in
         [yY] | [yY][Ee][Ss] )
                $FILE start
                tail -f $FUSE_PATH/$APP_NAME/$LOG
                ;;
         [nN] | [n|N][O|o] )
                ;;
        * )
        echo "Please answer yes or no.";;
        esac
        ;;
       * )
        echo "App $APP_NAME is running"
esac
fi
done

Estou tentando executar isso no RHEL 6

    
por Ubuntuser 26.06.2014 / 01:05

1 resposta

1

O comando read está acontecendo em um pipeline - ele está dentro do while loop, que tem sua entrada redirecionada da saída do comando find - assim, quando ele lê, ele está lendo a partir da lista de arquivos find gerados, em vez do terminal. A maneira mais simples que eu sei para consertar isso é enviar a lista de arquivos através de algo diferente da entrada padrão, então a entrada padrão ainda pode ser usada para outras coisas (como a confirmação do usuário). Contanto que você não esteja usando o descritor de arquivo nº 3 para outra coisa, isso deve funcionar:

# ...
while IFS= read -r -u3 -d '' FILE; do
    # same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)

O -u3 informa read a ler do FD3 e o 3< <(find...) redireciona o FD3 da saída do comando find . Observe que o <( ) (conhecido como substituição de processo) é uma extensão bash (não disponível em shells posix simples), portanto, você deve usá-lo somente em scripts que inicie com #!/bin/bash (não #!/bin/sh ).

    
por 26.06.2014 / 19:30

Tags