![각 while 루프 반복 후에 프롬프트를 얻는 방법은 무엇입니까?](https://rvso.com/image/154475/%EA%B0%81%20while%20%EB%A3%A8%ED%94%84%20%EB%B0%98%EB%B3%B5%20%ED%9B%84%EC%97%90%20%ED%94%84%EB%A1%AC%ED%94%84%ED%8A%B8%EB%A5%BC%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
각 루프 반복 후에 프롬프트를 원합니다.
예: 한 번의 반복이 수행되면 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
이제 파일 설명자 3에서 읽는 read line
동안 루프에서 상속된 일반 표준 입력을 통해 파일에서 읽습니다. read -p
파일 설명자 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