이 파이프라인 스크립트가 작동하지 않는 이유는 무엇입니까?

이 파이프라인 스크립트가 작동하지 않는 이유는 무엇입니까?
#!/bin/bash
rm out
mkfifo out
nc -l 8080 < out | while read line
do
    echo hello > out   
    echo $line
done

이 스크립트를 실행하는 컴퓨터(포트 8080 사용)의 IP를 탐색하면 "hello"라는 단어가 표시될 것으로 예상하고 스크립트를 실행하는 컴퓨터에서 요청의 줄을 출력하기를 원합니다.

그러나 아무 일도 일어나지 않았습니다. 브라우저는 어떤 응답도 받지 못하며 서버 터미널도 어떤 출력도 얻지 못합니다.

작동하지 않는 이유는 무엇이며 작동하도록 하려면 무엇을 수정해야 합니까? 나는 그것을 단순한 파이프로 유지하고 싶습니다. 프로세스 대체나 그와 유사한 것을 사용하고 싶지 않습니다.

답변1

리디렉션 < out으로 인해 명명된 파이프가 읽기 위해 열립니다. 쓰기를 위해 열려 있는 파이프가 없는 프로세스는 차단됩니다. 한편 파이프의 오른쪽은 명령에서 차단되어 파이프를 통해 출력되는 내용을 read기다리고 있습니다 (아직 시작되지 않음). nc그것은이중 자물쇠.

스크립트가 계속 실행되도록 하려면 명명된 파이프가 독립적인 쓰기 및 읽기를 위해 열려 있는지 확인하십시오. 예를 들어:

nc -l 8080 < out | while read line
do
    echo hello >&3
    echo "$line"
done 3>out

또는

nc -l 8080 < out | {
  exec 3>out
  while read line
  do
    echo hello >&3
    echo "$line"
  done
}

nc이와 같은 작업 은 0바이트를 읽은 후 입력이 닫히는 것을 확인하고 후속 쓰기는 읽기 위해 명명된 파이프가 다시 열릴 때까지 기다리는 것을 차단하므로 작동하지 않습니다 .

nc -l 8080 < out | {
  : >out
  while read line
  do
    echo hello >out
    echo "$line"
  done
}

관련 정보