Bash

PS1 提示顯示經過的時間

  • April 6, 2022

我目前使用它在我的 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沒有共同之處?

一種方法是使用 bash 的 PROMPT_COMMAND 功能來執行修改 PS1 的程式碼。下面的函式是我原始送出的更新版本;這個使用了兩個較少的環境變數,並在它們前面加上“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) 開始,您可以使用新的 printf 格式字元串來避免外部date呼叫;用 替換$(date +%s)碎片$(printf '%(%s)T' -1)從版本 4.3 開始,您可以省略-1參數以依賴“無參數意味著現在”行為。

引用自:https://unix.stackexchange.com/questions/252229