如何在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
相关产品推荐
相关产品推荐

