>

다음과 같은 bash 스크립트가 있습니다.

cat filename | while read line
do
    read input;
    echo $input;
done

그러나 while 루프에서 읽을 때 가능한 I/O 리디렉션으로 인해 파일 파일 이름에서 읽으려고 할 때 올바른 출력을 얻지 못합니다.

다른 방법으로도 같은 일을합니까?


  • 답변 # 1

    제어 터미널 장치에서 읽습니다 :

    read input </dev/tty
    
    

    추가 정보 : http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop

  • 답변 # 2

    유지 3을 통해 일반 stdin을 리디렉션하여 유지할 수 있습니다 파이프 라인 내부로 가져 오기 :

    { cat notify-finished | while read line; do
        read -u 3 input
        echo "$input"
    done; } 3<&0
    
    
    정말 cat 를 사용하는 경우

    BTW  이렇게하면 리디렉션으로 바꾸면 훨씬 쉬워집니다.

    while read line; do
        read -u 3 input
        echo "$input"
    done 3<&0 <notify-finished
    
    

    또는 해당 버전에서 stdin과 unit 3을 교체 할 수 있습니다. 파일을 unit 3으로 읽고 stdin을 그대로 두십시오.

    while read line <&3; do
        # read & use stdin normally inside the loop
        read input
        echo "$input"
    done 3<notify-finished
    
    

  • 답변 # 3

    루프를 다음과 같이 변경하십시오 :

    for line in $(cat filename); do
        read input
        echo $input;
    done
    
    

    단위 테스트 :

    for line in $(cat /etc/passwd); do
        read input
        echo $input;
        echo "[$line]"
    done
    
    

  • 답변 # 4

    두 번 읽는 것처럼 보이지만 while 루프 내부의 읽기는 필요하지 않습니다. 또한 cat 명령을 호출 할 필요가 없습니다 :

    while read input
    do
        echo $input
    done < filename
    
    

  • 답변 # 5

    echo "Enter the Programs you want to run:"
    > ${PROGRAM_LIST}
    while read PROGRAM_ENTRY
    do
       if [ ! -s ${PROGRAM_ENTRY} ]
       then
          echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
       else
          break
       fi
    done
    
    

관련 자료

  • 이전 javascript - 글꼴 (@ font-face)이 이미로드되었는지 확인하는 방법
  • 다음 css3 - 부모 높이에 올바르게 영향을 미치는 CSS의 회전 요소