Skip to main content
Metaist

How long do commands run?

One of the most remarkable things about uv is just how fast it is. In fact, Charlie Marsh and the Astral team have been such an inspiration, that I got curious about how long commands take.

So I did the natural thing and updated my ~/.bashrc (I'll update my .zshrc soon) to change my prompt to display the number of milliseconds the previous command took.

At the very top of the file, I define a variable to hold the current time in nanoseconds. Putting this here lets me know how long the .bashrc itself takes to run.

Then I used preexec() to record the start time of every command. To make this work properly, you need to download bash-preexec.

Finally, I used PROMPT_COMMAND which will get called to produce my prompt. To add a splash of color (i.e. red if the previous command failed), I used brush.

Putting it all together:

# very top of ~/.bashrc
_time_cmd=$(date +%s%N)

# <snip>

# https://github.com/metaist/brush
source ~/.local/bin/brush

preexec() { # record command start time
    _time_cmd=$(date +%s%N)
}


PROMPT_COMMAND=__prompt_command
__prompt_command() {
    local code="$?" # must be first line in this function
    PS1="\[\e]0;\w\a\]\n" # set terminal title

    # <snip>

    # add run time of previous command (in red if error)
    PS1+="$(brush reset)"
    if [[ "$code" != "0" ]]; then
        PS1+=$(brush bgRed)
    fi
    PS1+=$(( ( $(date +%s%N) - $_time_cmd ) / 1000000 ))ms
    PS1+="$(brush reset)"

    # <snip>

    PS1+="\n\$ "
}

# <snip>

# https://github.com/rcaloras/bash-preexec
source ~/.bash-preexec.sh # must be last import

# very bottom