パイプライン後に複数のコマンドを実行する

パイプライン後に複数のコマンドを実行する

出力を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され、ddBeyondを介して渡されます}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)。これは、トリガーが文字の途中、最初の文字の直後に発生することを意味します。バイト、正確に設計されているように。

おすすめ記事