각 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

이제 파일 설명자 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

관련 정보