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

后端 未结 14 2869
無奈伤痛
無奈伤痛 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 05:57

    this is my version

    • use date to format time, only calc days
    • set terminal title
    • use \$ in PS1 for user $ + root #
    • show return code / exit code
    • use date -u to disable DST
    • use hidden names like _foo
    _x_dt_min=1 # minimum running time to show delta T
    function _x_before {
        _x_t1=${_x_t1:-$(date -u '+%s.%N')} # float seconds
    }
    function _x_after {
        _x_rc=$? # return code
        _x_dt=$(echo $(date -u '+%s.%N') $_x_t1 | awk '{printf "%f", $1 - $2}')
        unset _x_t1
        #_x_dt=$(echo $_x_dt | awk '{printf "%f", $1 + 86400 * 1001}') # test
        # only show dT for long-running commands
        # ${f%.*} = int(floor(f))
        (( ${_x_dt%.*} >= $_x_dt_min )) && {
            _x_dt_d=$((${_x_dt%.*} / 86400))
            _x_dt_s='' # init delta T string
            (( $_x_dt_d > 0 )) && \
                _x_dt_s="${_x_dt_s}${_x_dt_d} days + "
            # format time
            # %4N = four digits of nsec
            _x_dt_s="${_x_dt_s}$(date -u -d0+${_x_dt}sec '+%T.%4N')"
            PS1='rc = ${_x_rc}\ndT = ${_x_dt_s}\n\$ '
        } || {
            PS1='rc = ${_x_rc}\n\$ '
        }
        # set terminal title to terminal number
        printf "\033]0;%s\007" $(tty | sed 's|^/dev/\(pts/\)\?||')
    }
    trap '_x_before' DEBUG
    PROMPT_COMMAND='_x_after'
    PS1='\$ '
    

    sample output:

    $ sleep 0.5
    rc = 0
    $ sleep 1
    rc = 0
    dT = 00:00:01.0040
    $ sleep 1001d
    rc = 0
    dT = 1001 days + 00:00:00.0713
    $ false
    rc = 1
    $ 
    

提交回复
热议问题