web-dev-qa-db-ja.com

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

正常に動作するmpvプレーヤーにストリーマー出力をパイプしています。

streamer -o -  |  mpv - 

しかし、mpvを開始する前に、1つのプログラムを強制終了してから、mpvにパイプします。

ストリーマープログラムは、ビデオのバッファリングに時間がかかり、10〜15秒後にmpvに送信します。この10〜15秒で、screen_saverを表示し、ストリーマーがmpvへの送信を開始したときにそれを強制終了します。

以下のコマンドはscreen_saverを強制終了しますが、mpvは実行しません。

streamer -o -  | pkill screen_saver ;  mpv - 
2
jonny789
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の直後に、設計どおりに発生したことを意味するだけです。

3