在 linux shell 脚本中,用 trap 捕获执行耗时的核心是:脚本开头重置 seconds=0 或记录 start=$(date +%s.%n),再通过 trap 'echo "耗时: ${seconds}s"' exit 在所有退出路径(含正常、中断、错误)统一记录耗时,注意日志路径用绝对路径、避免子进程干扰、确保权限与环境安全。

在 Linux Shell 脚本中,用 trap 捕获脚本执行耗时,核心思路是:在脚本开始前记录起始时间,在退出(包括正常结束、中断、错误)时计算并记录耗时。关键在于利用 trap 的 EXIT 信号捕获所有退出路径,并结合 BASH_PID 或 $? 等变量增强实用性。
用 trap + SECONDS 实现轻量级耗时统计
SECONDS 是 Bash 内置的只读变量,从 shell 启动(或显式清零)开始自动累加秒数,无需调用外部命令,开销极小。
- 脚本开头设置
SECONDS=0,重置计时起点 - 用
trap 'echo "耗时: ${SECONDS}s" >> /var/log/myscript.log' EXIT在任意退出时写入日志 - 日志路径建议用绝对路径,避免因工作目录变化导致写入失败
记录更精确时间(含毫秒)和退出状态
若需毫秒级精度或区分成功/失败,可改用 date +%s.%N 获取纳秒时间戳:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 脚本开头:
start=$(date +%s.%N) - trap 中:
end=$(date +%s.%N); elapsed=$(echo "$end - $start" | bc -l); echo "$(date): 耗时 ${elapsed}s, 退出码 $?" >> /path/to/log - 注意:需安装
bc;$(date)可提供可读时间,便于排查
避免 trap 被子进程干扰(关键细节)
默认情况下,trap 只对当前 shell 生效,子 shell(如管道、(...))会继承但不触发父 trap。若脚本含重要子进程,应确保主流程退出才记录:
- 不要在后台任务(
&)里依赖主 trap —— 它们有自己的生命周期 - 如需监控某条命令耗时,直接用
time command或封装函数,而非依赖全局 trap - 若脚本调用
exec替换自身,EXITtrap 仍会触发;但exit被屏蔽时(如被set -e中断),trap 依然有效
配合日志轮转与权限处理
生产环境需考虑日志可持续写入:
- 检查日志目录存在且当前用户有写权限:
mkdir -p /var/log/myscript && chmod 755 /var/log/myscript - 用
logger替代文件重定向,交由 syslog 管理(支持轮转、远程转发):trap 'logger -t myscript "耗时 ${SECONDS}s, 退出码 $?"' EXIT - 敏感脚本中避免在日志里暴露参数,可用
${0##*/}记录脚本名而非完整命令行
不复杂但容易忽略:trap 的执行环境继承当前 shell 的变量和重定向,但不继承未导出的函数;务必在 trap 字符串中使用单引号防止提前展开变量。










