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