Bash: 읽기 루프 동안 입력 읽기가 작동하지 않습니다.

Bash: 읽기 루프 동안 입력 읽기가 작동하지 않습니다.

while 읽기 루프 내에서 입력 읽기가 작동하지 않는 것 같습니다.

while read line
do
 echo "get some input from the user"
 read response
done < some_file.txt

읽기가 루프 외부에 있었던 것처럼 실행이 일시 중지되지 않습니다. 왜 이런거야? while 읽기 루프 내에서 입력을 읽는 해결 방법이 있습니까?

답변1

문제는 read line와 가 모두 read response에서 데이터를 기대하고 얻는다는 것입니다 stdin.
이 질문SO에서는 더 많은 정보에 대한 링크와 함께 그 중 일부를 설명합니다.

tl;dr
허용되는 답변은 다음과 같습니다.

제어 터미널 장치에서 읽으십시오:read input </dev/tty

답변2

내부 읽기 명령이 stdin을 사용하고 while 루프에 대해 다른 파일 설명자를 사용하도록 합니다.

while read -u 3 line; do
  read -p "get some input from the user" response
done 3< some_file.txt

답변3

고마워요 니플! 그리고 bgStack에게도 감사드립니다. 몇 시간 동안 검색한 끝에 마침내 답을 얻었습니다! 훌륭해요!! 내 터미널 경로를 감지하기 위해 "echo $(tty)"를 사용했거나 그냥 변수로 사용했습니다. 나에게 그것은 다른 사용 사례였습니다. U는 파일을 읽고 있었고 실행을 확인하고 싶습니다. 어쩌면 아래 예가 다른 사람에게 도움이 될 수도 있습니다.

#!/bin/bash

export terminal=$(tty)

cat file | while read val1 val2
do
   while true; 
            do
              read -p "would you like to XYZ" yn
              case $yn in
                        [Yy]* )     echo "# Move $val1 to $val2        #";break;;
                        [Nn]* )     echo "#---------no action----------#";break;;
                        * )         echo "# Please answer yes or no.   #";;
              esac
            done < $terminal
done

답변4

Nifle은 정확히 맞습니다. 그러나 여러 터미널을 사용하는 경우에는 구체적이어야 합니다.

Google에서 오신 분들은 이 페이지를 찾으신 것을 축하드립니다. while 읽기 루프(여기에는 rm -i, 또는 기타 항목 포함) 중에 사용자 입력을 수행해야 하는 경우 read사용할 입력 파이프를 지정할 수 있습니다.

다음은 제가 사용한 이 솔루션의 일부입니다.

#in declarations
thistty=$(tty)

lsuser -R LDAP -a home pgrp ALL 2>/dev/null | while read line
do
   homedir=$(echo $homedir | awk -F= '{print $2}')
   sudo rm -ir "$homedir" < $thistty
done

관련 정보