첫 번째 명령 일치의 출력을 greping한 후 명령을 실행하는 방법

첫 번째 명령 일치의 출력을 greping한 후 명령을 실행하는 방법

터미널에서 실행되고 준비가 되면 사용 중인 포트를 출력하는 서버 유형 프로그램(http-server)을 시작해야 합니다. 포트 번호가 표시될 때까지 기다린 다음 서버 유형 프로그램이 될 다른 명령을 실행하고 싶습니다(사용자 상호 작용을 실행하고 허용함).

거의 사용할 수 있어요

http-server | (grep -m 1 "Server runing"; interactiveProgram)

InteractiveProgram은 grep이 첫 번째 줄과 일치한 후에 시작되지만 대화형은 아닙니다.)

답변1

문제는 다음과 같습니다.

http-server | (grep -m 1 "Server running"; interactiveProgram)

interactiveProgram표준 입력은 터미널에 연결되지 않지만 http-server표준 출력에서 ​​파이프로 연결됩니다( grep완료되면).

http-server | (grep -m 1 "Server running"; interactiveProgram < /dev/tty)

당신이 원하는 것을해야합니다.

답변2

이것을 파이프라인의 일부로 실행하면 @Stephen Kitt가 이미 말했듯이 표준 입력이 터미널에 연결되지 않습니다. 그러나 나중에 실행하면 http-server가 종료될 때까지 실행되지 않습니다.

해결 방법은 -loop를 사용 while하고 grep한 줄에 한 번씩 호출하는 것입니다.

http-server | while read line; do
    echo "$line" | grep "Server running" && { interactiveProgram; break; }
done

관련 정보