ターミナルセッションのユーザー入力とプログラム出力を別々に記録できますか?

ターミナルセッションのユーザー入力とプログラム出力を別々に記録できますか?

script私はこのようなことができたらと思います。

❯ script --user=call.log --prog=response.log
    Script started

❯ echo foo
    foo

❯ exit
    Script done

❯ cat call.log
    echo foo

❯ cat response.log
    foo

そうではなく、代替案を探しています。

実際の出力を見ると、script次のようになります。

^M^[[35m❯ ^[[Ke^Hecho foo#[[?1l^[>^?2004l^M^M
^[]0;tmp: echo foo^Gfoo^M

私が欲しいものを抽出するためにパーサーを書くことを検討しました。しかし、これは特にユーザーのシェル構成に依存しているように見えるため、脆弱に見えます。

セッションの開始と終了を別々に記録するより良い方法はありますか?

答え1

さまざまなアプリケーションの内部を理解していないと、端末ドライバ(アプリケーションの代わりに)がどの文字を反転しているのか、どの文字が特定のアプリケーションから出力されるのかはわかりません。

私は使うscript出力キャプチャコマンドラインあなたの例のようなアプリケーションを作成し、スクリプトを使用してエスケープシーケンスをフィルタリングします(例:Unixユーティリティを使用してプログラムでANSI制御コードをファイルに「書き込み」できますか?)。

これは、エディタなどのフルスクリーンアプリケーションでは正しく機能しません。これは、カーソルが画面を横切って移動してテキストを更新するときに何が起こるのかを明確に示していないからです。この目的のために、(通常)セッションをスローモーションで再生するだけで十分です(例:slowcat)。

関連情報