8

編集:この質問はもともとbash固有のものでした。私はまだbashソリューションが欲しいのですが、別のシェルでこれを行う良い方法があれば、それも知っておくと便利です!

さて、問題のトップレベルの説明です。たとえば$cat foo | sort -n | less、ユーザーが入力すると、これが傍受されてに変換されるように、bash にフックを追加できるようにしたいと考えていますwrapper 'cat foo | sort -n | less'。各コマンドの前後にコマンドを実行する方法 (DEBUG トラップまたは PROMPT_COMMAND などを使用) を見てきましたが、各コマンドを傍受して別のプロセスで処理できるようにする方法については何もありません。これを行う方法はありますか?

人々がそれにアプローチする方法について他の提案を持っている場合に備えて、私がこれをやりたい理由の説明について:

スクリプトなどのツール端末で行うすべてのことをログに記録できます (ある程度、bash の履歴と同様)。ただし、スクリプトは入力と出力を 1 つの大きな文字列に混ぜ合わせて、画面を引き継ぐ vi などのアプリケーションと混同し、履歴は入力された生のコマンドのみを提供し、どちらも機能しません。同時に複数の端末にコマンドを入力している場合。私がやりたいのは、より豊富な情報をキャプチャすることです。例として、コマンド、実行時間、完了時間、終了ステータス、stdin と stdout の最初の数行です。また、これを、複数の端末をうまく多重化できるリスニングデーモンに送信することもお勧めします。

これの動機は、事後の手順のような探索的データ分析を理解しようとすることにあります。このようなより豊富な情報があれば、何が起こったのかについて適切なレポートを生成し、1 つのコマンドの複数の呼び出しを 1 つにまとめて、最初のいくつかがゼロ以外の終了を返し、ファイルに触れたすべてのものを検索してファイルがどこから来たのかを尋ねることが可能になります。などなど

4

2 に答える 2

2

次の bash スクリプトを実行します。

#!/bin/bash
while read -e line
do
    wrapper "$line"
done

最も単純な形式では、 でwrapper構成できますeval "$LINE"。あなたはタイミングが欲しいと言ったので、代わりにtime eval "$line". 終了ステータスを取得したかったので、この行の後にsave=$?. そして、stdout の最初の数行をキャプチャしたかったので、いくつかのリダイレクトが必要です。等々。

詳細: Jo So は、複数行の bash コマンドの処理を含めることを提案しています。最も単純な形式では、eval が「構文エラー:予期しないファイルの終わり」で返された場合、続行する前に別の入力行を要求する必要があります。さらに良いことに、適切な bash コマンドを確認するには、実行するbash -n <<<"$line"前にeval. bash -n行末エラーが報告された場合は、`$line' に追加する入力を求めるプロンプトが表示されます。等々。

于 2013-12-11T19:52:59.023 に答える
0

Binfmt_misc が思い浮かびます。Linux カーネルには、任意の実行可能ファイル形式を認識してユーザー アプリケーションに渡す機能があります。

この機能を使用してラッパーを登録できますが、任意の実行可能ファイルを処理する代わりに、すべての実行可能ファイルを処理する必要があります。

于 2013-12-11T23:51:38.403 に答える