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

如何在Bash中为每条命令前后打印Unix时间戳

在Bash命令前后自动打印Unix时间戳

要实现每条终端命令执行前后打印Unix时间戳,且副作用最小,可通过DEBUG陷阱和PROMPT_COMMAND结合的方式,仅在终端显示额外信息,不干扰命令本身的输出日志。

实现代码

将以下内容添加到~/.bash_profile中:

# 用于存储命令开始时间的全局变量
__cmd_start_time=""

# DEBUG陷阱:在顶层非空命令执行前触发,打印开始时间
trap 'if [ $BASH_SUBSHELL -eq 0 ] && [ -n "$BASH_COMMAND" ] && [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ]; then
    __cmd_start_time=$(date +%s)
    echo "Started execution at: $__cmd_start_time"
fi' DEBUG

# PROMPT_COMMAND:命令执行完成、显示提示符前触发,打印结束时间并重置变量
PROMPT_COMMAND='if [ -n "$__cmd_start_time" ]; then
    echo "Finished execution at: $(date +%s)"
    __cmd_start_time=""
fi'

关键逻辑说明

  • DEBUG陷阱:Bash会在每条命令执行前触发该陷阱。通过BASH_SUBSHELL -eq 0确保仅处理顶层命令(避免多行命令、子shell命令重复触发);[ -n "$BASH_COMMAND" ]过滤空命令(仅按回车的情况);排除PROMPT_COMMAND本身防止循环触发。
  • PROMPT_COMMAND:Bash会在显示命令提示符前执行该变量中的代码,正好对应命令执行完成的时机,此时打印结束时间并重置开始时间变量,避免空命令触发。

效果验证

输入任意前台命令后,终端会输出:

[prompt]$ ls -l
Started execution at: 1718567890
total 8
-rw-r--r-- 1 user user  0 Jun 16 10:00 test.txt
Finished execution at: 1718567890
[prompt]$ 

注意事项

  • 后台命令(如sleep 5 &)会立即打印结束时间,因为终端会快速回到提示符,此为正常行为,若需跟踪后台进程完成时间,需额外结合进程监控逻辑,但会增加复杂度。
  • 该方案仅向终端打印时间戳,不会修改命令本身的stdout/stderr输出,因此不会干扰命令日志的捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:27:37