Пользовательский ввод не принимается во вложенном операторе case

Пользовательский ввод не принимается во вложенном операторе case

Я пытаюсь создать вложенный оператор case, в котором ожидается ввод пользователя (Y/N). Однако система никогда не ждет ввода и всегда переходит к третьему варианту: «Пожалуйста, ответьте да или нет». Может кто-нибудь сказать мне, что я упускаю?

Вот изложение дела

 #!/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

Я пытаюсь выполнить это в RHEL 6.

решение1

Команда readвыполняется в конвейере — она находится внутри whileцикла, ввод которого перенаправляется из вывода команды find— поэтому при чтении она читает из списка findсгенерированных файлов, а не из терминала. Самый простой известный мне способ исправить это — отправить список файлов через что-то, отличное от стандартного ввода, чтобы стандартный ввод можно было использовать для других целей (например, для подтверждения пользователя). Пока вы не используете дескриптор файла № 3 для чего-то еще, это должно работать:

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

Говорит читать из FD3, а перенаправляет FD3 из вывода команды . Обратите внимание, что ( -u3известный как подстановка процесса) является расширением bash (недоступным в простых оболочках posix), поэтому вы должны использовать его только в скриптах, с которых вы начинаете (не ).read3< <(find...)find<( )#!/bin/bash#!/bin/sh

Связанный контент