$ BASH_COMMANDを使用して、現在実行中のコマンドを取得するスクリプトを作成しました。スクリプトは基本的に、tmuxセッションごとに開かれている現在のコマンドとファイルを把握するためのロジックを実行しています。ユーザーがパイプコマンド(つまりcat file | less
)を実行する場合を除いて、すべてがうまく機能します。この場合、$ BASH_COMMANDは、パイプの前の最初のコマンドのみを格納しているように見えます。その結果、コマンドをless[file]
(ファイルを開いている実際のプログラム)として表示する代わりに、スクリプトはコマンドをとして出力しますcat[file]
。
私が使用しようとした1つの代替手段はhistory 1
、$BASH_COMMANDの代わりに依存することです。この代替案にもいくつかの問題があります。まず、$ BASH_COMMANDのようにエイリアスを自動拡張しないため、スクリプトが混乱する可能性があります(たとえば、無視するように指示したが、代わりに(にマップされた)をls
使用すると、スクリプトは無視しませんコマンド、とにかくそれを処理する)、そして各エイリアスに追加の条件を含めることは、クリーンな解決策のようには思えません。2番目の問題は、HISTIGNOREを使用して、スクリプトに認識させたいいくつかの一般的なコマンドを除外していることです。履歴を使用すると、履歴によって追跡されない限り、スクリプトは最後のコマンドを無視します。ll
ls -l
${#PIPESTATUS[@]}
また、配列の長さが1(パイプなし)以上(パイプが使用されている場合は、代わりに履歴を取得します)かどうかを確認するためにを使用してみましたが、常に1つのコマンドしか認識していないようです。
私のために働く可能性のある他の選択肢(現在のサブコールの完了後に実行される他のサブコールの$ BASH_COMMANDを格納する別の変数、またはパイプがで使用されたかどうかを知るための何らかの方法など)を知っている人はいますか?最後のコマンド)?