You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:35:33