
사용자 입력이 예상되는(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
내부에 있으므로 읽을 때 터미널이 아닌 생성된 파일 목록에서 읽습니다 . 이 문제를 해결하는 가장 간단한 방법은 표준 입력이 아닌 다른 방법으로 파일 목록을 보내는 것입니다. 그러면 표준 입력을 다른 작업(예: 사용자 확인)에 계속 사용할 수 있습니다. 다른 용도로 파일 설명자 #3을 사용하지 않는 한 다음은 작동합니다.while
find
find
# ...
while IFS= read -r -u3 -d '' FILE; do
# same inside of the loop...
done 3< <(find /etc/init.d/* -name '*service' -print0)
FD3에서 읽으라고 지시하고 명령 -u3
출력 에서 FD3을 리디렉션합니다 . (프로세스 대체라고도 함) 은 bash 확장(일반 posix 쉘에서는 사용할 수 없음)이므로 시작하는 스크립트에서만 사용해야 합니다 ( 가 아님 ).read
3< <(find...)
find
<( )
#!/bin/bash
#!/bin/sh