Bash
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沒有共同之處?
一種方法是使用 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
參數以依賴“無參數意味著現在”行為。