Bash 프로세스 대체에서 표준 출력의 첫 번째 줄을 캡처하는 방법은 무엇입니까?

Bash 프로세스 대체에서 표준 출력의 첫 번째 줄을 캡처하는 방법은 무엇입니까?

다음 bash 블록을 사용하고 있는데 예상 출력의 첫 번째 줄이 인쇄되지 않습니다.

    exec 3< <(python3 -m http.server)
    while true; do
            read -t 2 line
            echo "reading..."
            echo "$line"
    done <&3

시작 시 python3 -m http.server한 줄을 인쇄 Serving HTTP on 0.0.0.0 port 8000하지만 위의 코드는 해당 줄을 인쇄하지 않습니다. 그러면 Python은 이를 인쇄하고 GET 요청이 발생할 때마다 인쇄합니다. Bash에 첫 번째 줄이 누락된 이유는 무엇입니까?

내 목표는 이것을 스크립트에 넣고 echo호출을 리디렉션된 프로세스의 테스트로 대체하여 부팅이 완료되었음을 나타내는 것입니다. 그런 다음 루프를 중단하고 스크립트를 종료합니다(따라서 부팅이 완료될 때까지 스크립트 실행을 차단함). 백그라운드에서 리디렉션된 프로세스가 계속 진행됩니다. http.server이것은 단지 내 테스트 사례입니다.

답변1

그 이유는 다음과 같습니다.

  • Python은 파이프나 파일로 리디렉션되면 출력 버퍼링을 수행합니다.
  • http.server첫 번째 줄을 stdout에 쓴 다음 stderr에 대한 로그에 액세스합니다.

다음을 수행해야 합니다.

exec 3< <(python3 -u -m http.server 2>&1)

목표에 대해 말하자면, 특정 출력을 얻은 후에도 스크립트가 파이프에서 계속 읽어야 할 것 같습니다. 파이프에 대한 출력이 차단되면 하위 프로세스의 실행이 중지되기 때문입니다.

관련 정보