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

如何在Fish Shell中自动记录命令耗时并按需查看?

自动记录命令耗时并按需查看的实现方案

Fish Shell 实现(匹配你的示例输出)

Fish 自带事件钩子,能轻松实现自动记录命令耗时。要获取示例里的usr/sys详细时间,需结合Fish的time命令和历史记录,注意:如果命令有副作用(比如修改文件、发送请求),这种方法会重复执行命令,需谨慎使用。

步骤1:配置自动记录逻辑

编辑Fish的配置文件~/.config/fish/config.fish,添加以下内容:

# 定义postexec钩子:命令执行完成后记录其time输出
function __auto_record_cmd_time --on-event fish_postexec
    # 获取上一条执行的命令(从历史记录读取)
    set last_cmd $history[1]
    # 执行time命令并将结果写入临时文件(覆盖旧记录)
    time $last_cmd > ~/.last_command_time 2>&1
end

# 定义last-time命令,用于查看最近一次耗时记录
function last-time
    cat ~/.last_command_time
end

步骤2:生效配置

重启Fish终端,或者执行source ~/.config/fish/config.fish让配置立即生效。

测试用法

$ sleep 2
$ last-time

________________________________________________________
Executed in    2.00 secs      fish           external
   usr time    2.28 millis  912.00 micros    1.37 millis
   sys time    0.30 millis  296.00 micros    0.00 millis

无副作用的轻量替代方案

如果不想重复执行命令,仅需要记录总耗时(毫秒级),可以直接用Fish内置的$CMD_DURATION变量:
修改config.fish内容为:

function __auto_record_cmd_time --on-event fish_postexec
    echo "Executed in $CMD_DURATION millis" > ~/.last_command_time
end

function last-time
    cat ~/.last_command_time
end

Bash Shell 实现

方法1:详细耗时记录(含usr/sys时间)

同样需注意:有副作用的命令会被重复执行,可能引发意外。

编辑~/.bashrc,添加以下内容:

# 记录上一条命令的耗时到文件
PROMPT_COMMAND='
# 获取上一条命令(过滤历史记录的序号)
last_cmd=$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//")
# 执行time命令并保存输出
time -v "$last_cmd" > ~/.last_command_time 2>&1
'

# 定义last-time命令
last-time() {
    cat ~/.last_command_time
}

执行source ~/.bashrc生效后,即可用last-time查看记录。

方法2:轻量总耗时记录

利用Bash的SECONDS变量记录总秒数:

# 记录命令开始时间
trap 'cmd_start=$SECONDS' DEBUG

PROMPT_COMMAND='
if [ -n "$cmd_start" ]; then
    elapsed=$(( SECONDS - cmd_start ))
    echo "Executed in $elapsed secs" > ~/.last_command_time
    unset cmd_start
fi
'

last-time() {
    cat ~/.last_command_time
}

Zsh Shell 实现

详细耗时记录

编辑~/.zshrc:

# preexec钩子:记录命令内容
preexec() {
    last_cmd="$1"
}

# precmd钩子:命令执行完成后记录耗时
precmd() {
    if [ -n "$last_cmd" ]; then
        time -v "$last_cmd" > ~/.last_command_time 2>&1
        unset last_cmd
    fi
}

# last-time命令
last-time() {
    cat ~/.last_command_time
}

执行source ~/.zshrc生效即可。


注意事项

  • 临时文件路径可自定义(比如/tmp/.last_cmd_time),避免用户目录产生冗余文件。
  • 带有副作用的命令(如rm file、curl -X POST),建议使用轻量总耗时方案,避免重复执行引发问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:35:28