파이프라인 후에 여러 명령 실행

파이프라인 후에 여러 명령 실행

출력을 mpv 플레이어로 스트리밍하고 있는데 훌륭하게 작동합니다.

streamer -o -  |  mpv - 

하지만 mpv를 시작하기 전에 프로그램을 종료한 다음 mpv로 파이프하고 싶습니다.

Streamer 프로그램은 비디오를 버퍼링하는 데 약간의 시간이 걸리며 10-15초 후에 mpv로 전송됩니다. 이 10~15초 동안 screen_saver를 표시하고 스트림이 mpv로 전송되기 시작하면 종료하고 싶습니다.

다음 명령은 screen_saver를 종료하지만 mpv는 실행하지 않습니다.

streamer -o -  | pkill screen_saver ;  mpv - 

답변1

streamer -o -  | { dd bs=1 count=1 2>/dev/null; pkill screen_saver; cat; } | mpv -

의 첫 번째 바이트 streamer가 캡처 dd되어 Beyond를 통해 전달됩니다 }. dd즉시 종료하고 pkill실행하면 다른 모든 작업이 완료됩니다 cat. 모든 스트림이 도착해야 합니다 mpv.

이를 위해서는 pkill표준 출력에 대한 침묵이 필요하며 아무것도 읽지 않아도 됩니다 streamer. 내 pkill것은 이렇습니다. 혹시라도 다음 사항을 확인하고 싶을 수도 있습니다 </dev/null pkill screen_saver >/dev/null.


일반 도구를 사용하여 아이디어를 테스트하려면 다음을 실행하세요.

cat | { dd bs=1 count=1 2>/dev/null; echo "triggered" >&2; cat; } | cat

그리고 뭔가를 입력하세요. (첫 번째 것은 cat클릭하기 전까지는 아무 것도 얻지 못할 수도 있습니다 Enter.) triggered<newline>입력의 첫 번째 바이트 다음에 삽입이 표시됩니다 . 이 문자열 cat은 stderr에 인쇄되므로 필요할 때 트리거가 발생함을 보여주기 위해 마지막으로 가져온 스트림을 방해하지 않습니다 .

바이트와 ​​함께 작동한다는 점을 명심하십시오 dd. 따라서 입력한 첫 번째 문자가 멀티바이트(예: śUTF-8)인 경우 콘솔 처리 및엇갈린명령의 stdout 및 stderr). 이는 트리거가 문자 중간, 첫 번째 문자 바로 다음에 발생한다는 것을 의미합니다.바이트, 정확히 설계된대로.

관련 정보