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

如何在.bashrc中正确配置Bash命令执行时长统计提示符

BASH 命令执行时长统计提示符正确实现方案

原有代码失效原因

  • 精度不足:内置变量$SECONDS仅支持秒级计数,执行时长小于1秒的命令会被统计为0s,误差极大
  • 陷阱触发逻辑错误:DEBUG级trap会在Bash执行每一条语句(包括配置文件加载、PROMPT_COMMAND内部逻辑、函数内单行命令)时触发,会反复覆盖计时器起始值,导致统计结果完全不准
  • 提示符赋值逻辑错误:直接给PS1赋值时${timer_show}会在配置加载瞬间就被展开为固定值,后续变量更新不会同步到提示符显示
  • 未做边界过滤:没有过滤空命令输入、快捷键触发等场景,会把Shell本身的渲染等待时间也算进命令时长

修正后可直接使用的代码

把下面这段放到你的.bashrc末尾即可,支持毫秒级精度,不会误统计:

# 命令执行时长统计
function __timer_start {
  # 跳过PROMPT_COMMAND内部执行场景,避免计时器被误重置
  [[ "${BASH_COMMAND}" != "$PROMPT_COMMAND" ]] && __timer_start_ns=$(date +%s%N)
}

function __timer_stop {
  local exit_code=$?
  timer_show=""
  # 没有有效起始时间戳就跳过统计
  if [[ -n "${__timer_start_ns}" ]]; then
    local delta_ns=$(($(date +%s%N) - __timer_start_ns))
    local delta_ms=$((delta_ns / 1000000))
    # 格式化时长:小于1秒显示毫秒,大于1秒显示秒保留1位小数
    if [[ $delta_ms -lt 1000 ]]; then
      timer_show="${delta_ms}ms"
    else
      timer_show="$(awk "BEGIN {printf \"%.1fs\", ${delta_ms}/1000}")"
    fi
    unset __timer_start_ns
  fi
  # 动态更新PS1,每次渲染提示符都会读取最新的timer_show值
  PS1="$ ${timer_show} "
  return $exit_code
}

trap '__timer_start' DEBUG
PROMPT_COMMAND=__timer_stop

可选自定义调整

  • 调整精度:修改纳秒/毫秒/秒的换算逻辑即可,需要整数秒级统计直接用$((delta_ns / 1000000000))取值
  • 修改提示符样式:直接调整PS1赋值的字符串内容,追加当前路径、Git分支、返回状态标识都可以
  • 增加超时高亮:当时长超过指定阈值(比如5s)时给timer_show套ANSI颜色码,比如\033[31m${timer_show}\033[0m即可显示红色高亮

内容的提问来源于stack exchange,提问作者wick3dr0se

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:21:25