2011-11-12 7 views
2

$ BASH_COMMANDを使用して現在実行中のコマンドを取得しているスクリプトを作成しました。スクリプトは、基本的には、各tmuxセッションに対して現在のコマンドとファイルがオープンされていることを把握するためのロジックを実行しています。ユーザーがパイプコマンド(すなわち、cat file | less)を実行する場合を除いて、すべてがうまくいきます。その場合、$ BASH_COMMANDはパイプの前に最初のコマンドを格納するように見えます。その結果、コマンドはless[file](ファイルが開いている実際のプログラム)である代わりに、cat[file]と出力されます。パイプを含む最後のbashコマンドを取得する

代わりに、私は$ BASH_COMMANDの代わりにhistory 1に依存しています。この代替案にもいくつか問題があります。まず、$ BASH_COMMANDのようなエイリアスを自動的に展開しない場合があります。スクリプトを混乱させる原因となる場合があります(たとえば、lsを無視してllls -lにマップされています)とにかくそれを処理するコマンドを無視しません)、各エイリアスの余分な条件文を含めることは、きれいなソリューションのようには見えません。 2つ目の問題は、私がHISTIGNOREを使っていくつかの一般的なコマンドを除外していることです。私はそれでもスクリプトに認識させたい、ヒストリを使ってスクリプトが履歴によって追跡されない限り最後のコマンドを無視するようにします。

また、アレイの長さが1(パイプなし)かそれ以上(パイプを使用する場合はその代わりに履歴を取得する)かどうかを調べるために、${#PIPESTATUS[@]}を試しましたが、常に1コマンドしか認識していないようですよく

私のために働く可能性のある他の選択肢(現在のサブコールが完了した後に実行される他のサブコールに対して$ BASH_COMMANDを格納する別の変数や、パイプ最後のコマンドで使用された)?

+4

ニックピット: 'less(1)'は実際にファイルを開いていません。 'cat(1)'はします。 'less(1)'は匿名パイプの内容を開いています。パイプは 'pipe(2)'で構築されました。 – sarnold

+0

これはあまり考えられない考えです。シェルから正しく実装できるかどうかは疑いの余地がありません。あなたは 'lsof'を試しましたか? –

答えて

0

私はあなたの実装を少し変更し、それを動作させるために "歴史"コマンドを使用する必要があると思います。また、コマンド "alias"を使用して、設定されたエイリアスすべてをチェックします。コマンド "which"が実際にPATHディレクトリに格納されているかどうかを確認します。幸運

関連する問題