You can record the time a command line is started and the time a prompt is displayed. Bash already keeps track of the starting date of each command line in its history, and you can note the time when you display the next prompt.
print_command_wall_clock_time () {
echo Wall clock time: \
$(($(date +%s) - $(HISTTIMEFORMAT="%s ";
set -o noglob;
set $(history 1); echo $2)))
}
PROMPT_COMMAND=print_command_wall_clock_time$'\n'"$PROMPT_COMMAND"
This only gives you second resolution, and only the wall clock time. If you want better resolution, you need to use an external date command that supports the %N format for nanoseconds, and the DEBUG trap to call date before running the command to time.
call_date_before_command () {
date_before=$(date +%s.%N)
}
print_wall_clock_time () {
echo Wall"Wall clock time: \
$((date +"$date_before+"%s.%N - %s.%N"$date_before" | bc))"
}
trap call_date_before_command DEBUG
PROMPT_COMMAND=print_command_wall_clock_timePROMPT_COMMAND=print_wall_clock_time
Even with the DEBUG trap, I don't think there's a way of automatically displaying processor times for each command, or being more discriminating than prompt to prompt.
If you're willing to use a different shell, here's how to get a time report for every command in zsh (this doesn't generalize to other tasks):
REPORTTIME=0
You can set REPORTTIME to any integer value, the timing information will only be displayed for commands that used more than this many seconds of processor time.
Zsh took this feature from csh where the variable is called time.