パイプを含む最後のbashコマンドを取得する

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

私が使用しようとした1つの選択肢は$ BASH_COMMANDではなく history 1 です。この代替案にもいくつか問題があります。まず、$ BASH_COMMANDのようなエイリアスを自動拡張しない場合があります。これは、スクリプトが混乱する原因となることがあります(たとえば、 ls 代わりに( ls -l <�​​/ code>にマップされている)、スクリプトはコマンドを無視して、それを処理しません)、エイリアスごとに余分な条件を含めることはクリーンな解決策のようには見えません。 2つ目の問題は、私がHISTIGNOREを使っていくつかの一般的なコマンドを除外していることです。私はそれでもスクリプトに認識させたい、ヒストリを使ってスクリプトが履歴によって追跡されない限り最後のコマンドを無視するようにします。

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

誰かが私のために働くことができる他の選択肢(現在のサブコールが完了した後に実行される他のサブコールに対して$ BASH_COMMANDを格納する別の変数や、パイプが使用されているかどうかを知るための何らかの方法最後のコマンド)?

2
追加された 編集された
ビュー: 1
1つのニックピック: less(1)は実際にファイルを開いていません。 cat(1)はそうです。 less(1)は匿名パイプの内容を開いています。パイプは pipe(2)で構築されました。
追加された 著者 sarnold,
これはあまり考えられない考えです。シェルから正しく実装できるかどうかは間違いありません。 lsof を試してみましたか?
追加された 著者 Samus_,

1 答え

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

1
追加された
これは私のために働いた: LAST_CMD = $(history 1 | head -n1 | cut -c 8 - )
追加された 著者 saeedgnu,