각 루프 반복 후에 프롬프트를 표시하고 싶습니다.
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