如何在Bash History中显示命令执行时长?无需手动添加time前缀
在Bash命令历史中显示命令执行时长
要实现无需手动添加time命令,就能在历史记录中自动显示每个命令的执行时长,可通过Bash的陷阱机制和自定义history函数实现,步骤如下:
1. 配置时间记录与时长计算
将以下代码添加到你的~/.bashrc文件中:
# 初始化变量:存储命令开始时间和各命令执行时长 __cmd_start_time=0 declare -A __cmd_durations # 命令执行前触发DEBUG陷阱,记录当前纳秒级时间戳 trap '__cmd_start_time=$(date +%s%N)' DEBUG # 命令执行完成后(提示符显示前)计算时长并存储 PROMPT_COMMAND='__cmd_end_time=$(date +%s%N); __cmd_duration=$(( (__cmd_end_time - __cmd_start_time) / 1000000 )); if [[ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]]; then __cmd_durations[$(history 1 | awk '\''{print $1}'\'')]=$__cmd_duration; fi; '"$PROMPT_COMMAND"
2. 自定义history命令显示时长
继续在~/.bashrc中添加自定义history函数,覆盖默认命令以整合时长信息:
# 自定义history输出,包含执行时长 history() { local cmd_num cmd_time cmd_duration cmd_rest command history "$@" | while read -r line; do # 提取历史命令编号、原时间戳和命令内容 cmd_num=$(echo "$line" | awk '{print $1}') cmd_time=$(echo "$line" | awk '{print $2, $3}') cmd_rest=$(echo "$line" | cut -d' ' -f4-) # 获取对应命令的执行时长,无记录则显示0ms cmd_duration=${__cmd_durations[$cmd_num]:-0} # 根据时长大小格式化显示(毫秒/秒) if (( cmd_duration >= 1000 )); then printf "%5d %s %ds %s\n" "$cmd_num" "$cmd_time" "$((cmd_duration / 1000))" "$cmd_rest" else printf "%5d %s %dms %s\n" "$cmd_num" "$cmd_time" "$cmd_duration" "$cmd_rest" fi done }
3. 生效配置
执行以下命令让配置立即生效:
source ~/.bashrc
效果示例
之后运行命令并执行history,你会看到类似如下的输出:
1843 2023-03-01 13:17:20 0ms export HISTTIMEFORMAT="%F %T " 1844 2023-03-01 13:17:22 2ms history 1845 2023-03-01 13:20:15 5s sleep 5
关键说明
DEBUG陷阱:在每个命令执行前触发,记录高精度时间戳,确保时长计算准确。PROMPT_COMMAND:在命令执行完毕、提示符显示前触发,计算命令执行时长(转换为毫秒)并存储到关联数组中,数组索引对应历史命令的编号。- 自定义
history函数:解析默认history的输出,将存储的时长信息整合后格式化显示,自动根据时长大小切换毫秒/秒单位。
内容的提问来源于stack exchange,提问作者Kamil Kuczaj
相关产品推荐
相关产品推荐

