How can the last command's wall time be put in the Bash prompt?

后端 未结 14 2802
無奈伤痛
無奈伤痛 2020-12-04 05:16

Is there a way to embed the last command\'s elapsed wall time in a Bash prompt? I\'m hoping for something that would look like this:

[last: 0s][/my/dir]$ sl         


        
14条回答
  •  离开以前
    2020-12-04 06:02

    I took the answer from Ville Laurikari and improved it using the time command to show sub-second accuracy:

    function timer_now {
      date +%s%N
    }
    
    function timer_start {
      timer_start=${timer_start:-$(timer_now)}
    }
    
    function timer_stop {
      local delta_us=$((($(timer_now) - $timer_start) / 1000))
      local us=$((delta_us % 1000))
      local ms=$(((delta_us / 1000) % 1000))
      local s=$(((delta_us / 1000000) % 60))
      local m=$(((delta_us / 60000000) % 60))
      local h=$((delta_us / 3600000000))
      # Goal: always show around 3 digits of accuracy
      if ((h > 0)); then timer_show=${h}h${m}m
      elif ((m > 0)); then timer_show=${m}m${s}s
      elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
      elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
      elif ((ms >= 100)); then timer_show=${ms}ms
      elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
      else timer_show=${us}us
      fi
      unset timer_start
    }
    
    trap 'timer_start' DEBUG
    PROMPT_COMMAND=timer_stop
    
    PS1='[last: ${timer_show}][\w]$ '
    

    Of course this requires a process to be started, so it's less efficient, but still fast enough that you wouldn't notice.

提交回复
热议问题