bash:プロンプトが評価されたときに状態を保存する方法[重複]

bash:プロンプトが評価されたときに状態を保存する方法[重複]

コマンドプロンプトf.exで最後のコマンド実行期間を入力したいと思います。

user@host$ sleep 360
6m user@host$ 

また、最小しきい値(30秒など)より小さい場合は、期間が表示されないようにしたいと思います。

これを達成するために、PS1に関数呼び出しを入れることができます。

print_duration()
{
    ... calculation and formatting code ...
    echo -n $command_duration
}

PS1='$(print_duration)\u@\h:\W\$ '

問題は、print_duration()が子プロセス内で評価され、デフォルトのインタラクティブbashの環境変数が変更されないようにすることです。

上記のコードについてはわかりませんが、そのコードを切り取り、コマンドプロンプトに貼り付ける簡単な例を見てみましょう。

prompt_var=0

test_prompt()
{
    (( prompt_var++ ))
    echo -n "I was evaluated at $(date) and look at this: ${prompt_var} "
}

PS1='$(test_prompt)\$ '

結果は次のとおりです。

I was evaluated at Fri, Mar 27, 2015 16:27:48 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:52 and look at this: 1 $
I was evaluated at Fri, Mar 27, 2015 16:27:53 and look at this: 1 $

test_prompt() は実際には基本的なプロセスコンテキストで初めて評価されることに注意してください(関数の有効性を確認したい)。ただし、実際のプロンプトを表示する場合は、子プロセスでこれを行います(あまりきれいではありません)。

ただし、コメントで提案されているようにPROMPT_COMMANDを設定すると、次のようになります。

I was evaluated at Fri, Mar 27, 2015 16:38:02 and look at this: 1 $ PROMPT_COMMAND='(( prompt_var++ ))'
I was evaluated at Fri, Mar 27, 2015 16:38:09 and look at this: 2 $
I was evaluated at Fri, Mar 27, 2015 16:38:11 and look at this: 3 $
I was evaluated at Fri, Mar 27, 2015 16:38:12 and look at this: 4 $

これは、PROMPT_COMMANDが基本プロセスで評価されることを意味します。しかし、他の用途によく使用し、接続も不便で忘れてしまう可能性があるため、使用することは望ましくありません。

ベストアンサー1

使用PROMPT_COMMAND。あなたがしたいことはまさにその仕事のためです。プロンプトが評価される前に展開されます。このコードからいくつかのプロンプトコンテンツを派生するには、 で変数を設定しPROMPT_COMMANDpromptvars変える、次の変数をに含めますPS1状態保存 bash 機能そしてPS1でゼロ以外の戻り状態を表示特にすべてのコマンドに対してエイリアスを強制的に「追加」します。いくつかの例を見てください。

算術拡張機能を使用すると、プロンプトでシェルの状態を変更できますが、この方法では整数変数のみを変更できます。拡張結果はプロンプトに表示されますが、それを非表示にすることができます。

shopt -s promptvars
PS1='${nonexistent_array[$((counter+=$(calculate_increment)))]}…'

リンクはPROMPT_COMMANDとても簡単です。内容を追加するには、改行文字を追加し、実行したいコマンドを追加します。

おすすめ記事