배쉬 : 읽기 루프가 작동하지 않는 동안 입력 읽기


14

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

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

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

답변:


15

문제는 모두이다 read lineread response에서 예상하는 (그리고 도착) 데이터를 stdin. SO에
대한이 질문 은 더 많은 정보에 대한 링크로 그 중 일부를 설명합니다.

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

제어 터미널 장치에서 읽습니다. read input </dev/tty


16

내부 읽기 명령에 stdin을 사용하고 while 루프에 다른 파일 설명자를 사용하십시오.

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

1

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

Google에서 온 사람들을 위해이 페이지를 찾은 것을 축하합니다. (이 포함 잠시 읽기 루프 동안 사용자 입력을해야하는 경우 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

1

고마워요 또한 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

내 경우 while에는 파이프에서 읽은 다음 stdin에서 읽는 데 리디렉션을 사용했습니다 read something < %terminal.
eftshift0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.