PS1プロンプトに経過時間が表示されます。

PS1プロンプトに経過時間が表示されます。

現在、これを使用して bash プロンプトに現在時刻を表示します。

PS1=\[\e[0;32m\]\t \W>\[\e[1;37m\]

20:42:23 ~>

最後のプロンプトから経過した時間を表示できますか?たとえば、

00:00:00 ~> sleep 10
00:00:10 ~> sleep 20
00:00:20 ~>

これは以下に関連しています。バックグラウンドスクリプトで定期的にPS1を変更できますか?

ベストアンサー1

1つのアプローチは、bashのPROMPT_COMMAND関数を使用してPS1を変更するコードを実行することです。以下の関数は、最初に送信したものの更新版です。この関数は2つの環境変数が少なく、既存の変数が破損しないように「_PS1_」プレフィックスを付けます。

prompt_command() {
  _PS1_now=$(date +%s)
  PS1=$( printf "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
           $((  ( _PS1_now - _PS1_lastcmd ) / 3600))         \
           $(( (( _PS1_now - _PS1_lastcmd ) % 3600) / 60 )) \
           $((  ( _PS1_now - _PS1_lastcmd ) % 60))           \
       )
  _PS1_lastcmd=$_PS1_now
}
PROMPT_COMMAND='prompt_command'
_PS1_lastcmd=$(date +%s)

始めるには.bash_profileに入れてください。

プロンプトパラメータと一致するようにパラメータをすばやく入力する必要があることに注意してくださいsleep。時間は、実際にコマンドを入力するのにかかる時間を含むプロンプト間の差です。

00:00:02 ~> sleep 5   ## here I typed really quickly
00:00:05 ~> sleep 3   ## here I took about 2 seconds to enter the command
00:00:10 ~> sleep 30 ## more slow typing
00:01:35 ~>

後で追加した内容:

現在削除されている@Cyrusの答えに基づいて、追加の変数で環境を複雑にしないバージョンは次のとおりです。

PROMPT_COMMAND='
    _prompt(){
        PROMPT_COMMAND="${PROMPT_COMMAND%-*}-$SECONDS))\""
        printf -v PS1 "\[\e[0;32m\]%02d:%02d:%02d \W>\[\e[1;37m\] " \
                      "$(($1/3600))" "$((($1%3600)/60))" "$(($1%60))"
    }; _prompt "$((SECONDS'"-$SECONDS))\""

追加の遅い追加:

Bash バージョン 4.2 から開始echo $BASH_VERSION)、date新しいprintf形式の文字列を使用して外部呼び出しを防ぐ$(date +%s)ことができます$(printf '%(%s)T' -1)バージョン 4.3 以降-1、「引数がないことを意味する」に依存するために引数を省略できます。「行動。

おすすめ記事