正常に動作するmpvプレーヤーにストリーマー出力をパイプしています。
streamer -o - | mpv -
しかし、mpvを開始する前に、1つのプログラムを強制終了してから、mpvにパイプします。
ストリーマープログラムは、ビデオのバッファリングに時間がかかり、10〜15秒後にmpvに送信します。この10〜15秒で、screen_saverを表示し、ストリーマーがmpvへの送信を開始したときにそれを強制終了します。
以下のコマンドはscreen_saverを強制終了しますが、mpvは実行しません。
streamer -o - | pkill screen_saver ; mpv -
streamer -o - | { dd bs=1 count=1 2>/dev/null; pkill screen_saver; cat; } | mpv -
streamer
の最初のバイトはdd
によってキャプチャされ、}
を超えて通過します。 dd
はすぐに終了し、pkill
が実行され、それ以外はすべてcat
を通過します。すべてのストリームはmpv
に到達する必要があります。
これには、pkill
がstdoutでサイレントであり、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>
が挿入されているのがわかります。この文字列はstderrに出力されるため、最後のcat
が取得するストリームを妨害しないことに注意してください。ここでは、必要なときにトリガーが発生することを示しています。
dd
はバイトで機能するため、入力する最初の文字がマルチバイトの場合(UTF-8のś
など)、出力が驚かれる可能性があることに注意してください(コンソールのハンドルと- interlacesコマンドのstdoutおよびstderr)。これは、トリガーが文字の途中で、最初のbyteの直後に、設計どおりに発生したことを意味するだけです。