각 while 루프 반복 후에 프롬프트를 받으려면 어떻게 해야 합니까?

각 while 루프 반복 후에 프롬프트를 받으려면 어떻게 해야 합니까?

각 루프 반복 후에 프롬프트를 표시하고 싶습니다.

Press Enter to continue예를 들어 한 번의 반복을 수행할 때 두 번째 반복 후에 다시 수행해야 하고, 세 번째 반복 후에 다시 수행해야 하는 식입니다.

사용 중입니다 read -p " Press enter to continue "(그러나 건너뛰었습니다).

while read line

do

echo "$line" logs""

echo " "

echo "`tail -100 Domain1."$line"`"

read -p "Press enter to continue"

done<input.txt

답변1

내부 루프 read -p는 에서 읽혀지기 때문에 "건너뛰는" 것입니다(실제로는 아님) input.txt. 기본적으로 루프 내부의 모든 명령은 다음에 연결된 루프에서 표준 입력 스트림을 상속합니다.input.txt

대신, read line새 입력 파일 설명자에서 읽고 해당 설명자를 통해 파일 내용을 전달해야 합니다.

while IFS= read -r line <&3; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

여기서는 파일 설명자 3(표준 파일 설명자 다음으로 사용 가능한 무료 파일 설명자)을 사용하여 입력 파일에 연결합니다. 그런 다음 read line명시적으로 읽으라고 요청합니다.저것표준 입력(파일 설명자 0)이 아닌 파일 설명자입니다. 이렇게 하면 표준 입력이 무료로 유지되고 read -p평소대로 읽습니다.

또는 위 루프에서 입력 파일 설명자를 바꿀 수 있습니다.

while IFS= read -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue' <&3
done 3<&0 <input.txt

이제 read line루프에서 상속된 일반 stdin을 통해 read -p파일 설명자 3을 파일에서 읽습니다. 파일 설명자 3은 파일에서 표준 입력을 리디렉션하기 전에 표준 입력의 복사본으로 열립니다.

bash껍질 에서 ,

read <&3

다음과 같이 쓸 수도 있습니다.

read -u 3

따라서 "가장 깨끗한" 솔루션(최소량의 파일 설명자 저글링 구문을 포함한다는 의미에서)은 다음과 같을 수 있습니다.

while IFS= read -u 3 -r line; do
    printf '%s logs\n\n' "$line"
    tail -n 100 "Domain1.$line"
    read -p 'Press Enter to continue'
done 3<input.txt

관련 정보