내 스크립트에는 다음과 같은 응답 검사기가 있습니다.
#!/bin/bash
test_fn()
{
WARNFILE=$1
echo
echo "--- BEGIN ---"
cat ${WARNFILE}
echo "--- END ---"
echo
while true; do
read -r -n 1 -p "Continue? [y/n]: " REPLY
case $REPLY in
[yY]) break ;;
[nNqQ]) echo;exit ;;
*) printf "\033[31m%s\033[0m\n" " invalid input: ${REPLY}"
esac
done
}
test_fn /tmp/warning
좋은 결과...
$ ./test.sh
--- BEGIN ---
test warning
--- END ---
Continue? [y/n]: a invalid input: a
Continue? [y/n]: s invalid input: s
Continue? [y/n]: d invalid input: d
Continue? [y/n]: w invalid input: w
Continue? [y/n]: s invalid input: s
Continue? [y/n]: q
$
...깨질 때까지:
test_fn /tmp/warning
라인 포함:
test_fn /tmp/warning | tee -a /tmp/logfile
그런 다음 줄을 뒤섞습니다.
$ ./test.sh
--- BEGIN ---
test warning
Continue? [y/n]: --- END ---
aContinue? [y/n]: invalid input: a
sContinue? [y/n]: invalid input: s
dContinue? [y/n]: invalid input: d
fContinue? [y/n]: invalid input: f
q
$
왜 그렇게 잘 작동하는지 누가 알 수 있나요?
답변1
댓글을 답변으로 변환하려면:
read -p
결과를 inline으로 얻으려면 stderr에 프롬프트를 작성하고 tee
with 앞에 함수의 stderr을 stdout으로 파이프하십시오 tee
.
test_fn /tmp/warning 2>&1 | tee -a /tmp/logfile
입증된 read
동작:
$ read -p "my prompt: " >/dev/null
my prompt: hi
$ read -p "my prompt: " 2>/dev/null
hi