읽는 동안 루프에서 키보드 입력을 기다립니다.

읽는 동안 루프에서 키보드 입력을 기다립니다.

다음과 같이 구성된 bash 스크립트가 있습니다.

while read foo bar baz;
do
    echo "Processing $foo $bar $baz"
    # more code here
done < /etc/somefile

루프 내부에서 스크립트가 키보드 입력을 기다리도록 하고 싶습니다(기본적으로 "계속하려면 Enter 키를 누르세요"). 그러나 루프 내부의 다음 코드는

echo "Press [ENTER] to continue"
read -s

스크립트가 거기서 멈추게 하지 않습니다. 분명히 키보드가 아닌 제공된 파일에서 입력을 받습니다. 키보드에서 강제로 읽으려면 어떻게 해야 합니까?

답변1

read명시적으로 지정하지 않는 한, 파일을 루프에 입력하면 루프의 모든 인스턴스에 영향을 미칩니다. 다음은 작동합니다:

echo "Press [ENTER] to continue"
read -s < /dev/tty

답변2

다음 /bin/sh코드는 표준 입력의 복사본으로 파일 설명자 3을 엽니다. 루프 내부에서 read keypress루프 자체에 입력된 파일이 아닌 이 새 파일 설명자에서 읽습니다. 마지막으로 파일 설명자는 명시적으로 닫힙니다.

exec 3<&0
while read -r foo bar baz; do
    printf 'Processing %s, %s and %s\n' "$foo" "$bar" "$baz"
    printf 'Press <enter> to continue: ' >&2
    read keypress <&3
done <file
exec 3<&-

echo 'Done.'

이를 통해 예를 들어 다음을 사용할 수 있습니다.

yes | ./script.sh

enter모든 프롬프트에서 "자동으로 누르십시오".

관련 정보