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

如何在Fish Shell中获取完整的当前执行命令?

解决方案

你遇到的问题本质是fish默认不会实时同步命令到历史文件,且别名的静态替换特性不足以满足动态获取运行时上下文的需求,按以下方式调整即可实现预期效果:

1. 放弃别名,改用fish函数实现

将以下内容写入~/.config/fish/functions/notify.fish(如果目录不存在先手动创建),或者直接添加到~/.config/fish/config.fish中:

function notify
    # 提前保存上一条命令的退出状态,避免后续操作覆盖
    set last_status $status
    # 手动同步当前会话的执行历史到历史文件
    history merge
    # 读取最近一条执行的完整命令
    set current_cmd (history | head -n1)

    # 生成通知标题
    if test $last_status = 0
        set notify_title "$current_cmd 执行成功"
    else
        set notify_title "$current_cmd 执行出错,退出码 $last_status"
    end

    # 调用terminal-notifier发送通知
    terminal-notifier -message "Done with [$current_cmd]" \
        -title $notify_title \
        -sound default \
        -ignoreDnD
end

2. 方案说明

  • 加history merge的原因是fish默认只会在会话退出时将本次会话执行的命令写入历史文件,手动执行该命令可以强制实时同步,解决历史读取延迟的问题
  • 函数开头先保存$status是因为history merge执行成功后会把$status重置为0,会覆盖你之前执行的业务命令的真实退出状态
  • 该方案可以完整获取包含参数、管道符、多命令分隔符的整行执行内容,完全符合你echo 1; notify的使用场景需求

内容的提问来源于stack exchange,提问作者MLProgrammer-CiM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:09:01