ほぼすべての 利用可能な 同様の 質問を調査しましたが、役に立ちません。
問題について詳しく説明します。
私はいくつかの無人スクリプトを実行し、これらは標準出力と標準エラー行を生成できます。端末エミュレータで表示される正確な順序でそれらをキャプチャし、「STDERR:」や「STDOUT:」などのプレフィックスを追加します。
私はパイプを使用してみましたが、それらにエポールベースのアプローチさえ使用しませんでした。解決策はptyの使用法にあると思いますが、私はマスターではありません。また、GnomeのVTEのソースコードを覗きましたが、それほど生産的ではありませんでした。
理想的には、これを実現するためにBashの代わりにGoを使用しますが、できませんでした。パイプは、バッファリングのために正しい行順序を維持することを自動的に禁止しているようです。
誰かが似たようなことをすることができましたか?それとも、単に不可能ですか?ターミナルエミュレーターがそれを行うことができる場合、それはできないと思います-PTY(s)を異なる方法で処理する小さなCプログラムを作成することによるのでしょうか?
理想的には、非同期入力を使用してこれら2つのストリーム(STDOUTおよびSTDERR)を読み取り、2番目に必要に応じて再印刷しますが、入力の順序は重要です!
注:stderredは認識していますが、Bashスクリプトでは機能せず、プレフィックスを追加するために簡単に編集できません(基本的に多くのsyscallをラップするため)。
更新: 2つの要点の下に追加
(一貫した結果を証明するために、提供したサンプルスクリプトに1秒未満のランダムな遅延を追加できます)
更新:この質問に対する解決策は、@ Gillesが指摘したように、この他の質問も解決します。しかし、私は、あちこちで尋ねたことをすることは不可能であるという結論に達しました。使用する場合2>&1
、両方のストリームを正しくPTY /管のレベルでマージされているが、別々にストリームと1つが実際のアプローチを使用する必要があり、正しい順序で使用するstderredを involesシステムコールをフックとして見ることができるダーティ多くの方法です。
誰かが上記を反証できるなら、私はこの質問を更新したいと思っています。