entrada do usuário não aceita na instrução case aninhada

entrada do usuário não aceita na instrução case aninhada

Estou tentando criar uma instrução case aninhada na qual a entrada do usuário é esperada (S/N). Porém, o sistema nunca espera pela entrada e sempre vai para a terceira opção, “Responda sim ou não”. Alguém pode me dizer o que estou perdendo?

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

Responder1

O readcomando está acontecendo em um pipeline - está dentro do whileloop, que tem sua entrada redirecionada da saída do findcomando - então, quando ele lê, está lendo a lista de arquivos findgerados, e não o terminal. A maneira mais simples que conheço de corrigir isso é enviar a lista de arquivos por algo diferente da entrada padrão, para que a entrada padrão ainda possa ser usada para outras coisas (como 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)

Diz -u3para readler o FD3 e 3< <(find...)redireciona o FD3 da saída do findcomando. Observe que <( )(conhecida como substituição de processo) é uma extensão bash (não disponível em shells posix simples), portanto, você só deve usá-la em scripts com os quais você inicia #!/bin/bash(não #!/bin/sh).

informação relacionada