前の行がコマンドであることを確認してください。

前の行がコマンドであることを確認してください。

活性化したいWindowsターミナルシェルの統合バッシュから。 (私を判断しないでください。)良い機能は、端末が各コマンドのスクロールバーにマーカーを表示できることです。その色はコマンドの実行が成功したかどうかによって異なります。ただし、コマンドが実行されない場合(空白行、Ctrl-C...)、色は中間色のままにする必要があります。

これは、プロンプトに特別なエスケープシーケンスを配置することによって行われます。現在のプロンプトの単純化されたバージョンは次のとおりです。

PS1="\[\e]133;D;\$?\a\] \$ \[\e]133;B\a\]"

そこで、\e]133;D;\$?\a前のコマンドの終わりを表示し、最終的な;\$?戻りコードを含む端末がどのように終了したかを確認できます。 (そして\e]133;B\aプロンプトの終わりを表示します。)私の考えではいいえ;\$?前の入力がコマンドでない場合は含まれます(再び空白行、Ctrl-C...)。

この状況を検出する方法はありますか?

上記のドキュメントはPowerShell用のソリューションを提供していますが、それをBashに適用する方法がわかりません。 PowerShell は、各履歴エントリの一意の ID を保持し、各プロンプトを表示する前に、いくつかのロジックでグローバル変数を更新します。一方、私が知っている限り、bashはそのようなIDを保持しません。

zshソリューションがあれば私も採用します。

答え1

次のコードは Bash 5.2.15 で動作します。

_debug() { [ "$BASH_COMMAND" != _prompt_command ] && SHOW_STATUS=1; }
_prompt_command() { STATUS=";$?"; [ -z "$SHOW_STATUS" ] && STATUS=; SHOW_STATUS=; }
PROMPT_COMMAND=_prompt_command
trap _debug DEBUG
PS1="\$STATUS \$ "

これは、コマンドと非コマンドを合理的に区別し、それに応じて;\$?プロンプトに含まれたり含まれない可能性がある概念証明です。DEBUGコマンドでない場合、トラップは実行されないため機能します。

残念ながら、このようなサブシェルはトラップを(echo foo)トリガせず、明示的なサブシェルパイプ(たとえば(echo foo) | (cat))も機能しません。これが私の解決策の欠陥です。それにもかかわらず、これらのコマンドはインタラクティブシェルではほとんど発生しない可能性があります(私のワークフローではこれらのコマンドが非常にまれであることがわかります)、この欠陥がマイナーであることがわかります。

あなたの場合、定義行は次PS1のようになります。

PS1="\[\e]133;D\$STATUS\a\] \$ \[\e]133;B\a\]"

ただし、Windows端末ではテストできません。

関連情報