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

如何在Fish Shell中获取带参数的上一条命令?

Fish Shell中获取上一条命令并实现语音通知的方案

核心方案:自动拆分同行内的前一条命令

Fish的$history会记录整行命令,我们可以通过字符串处理拆分出同行中执行的前一个命令单元。修改你的sr函数如下:

function sr
    # 获取上一条历史记录(整行内容)
    set last_line $history[1]
    # 按分号/逻辑运算符拆分,提取第一个命令并去除多余空格
    set last_cmd (echo $last_line | awk -F '[;&]' '{print $1}' | xargs)
    
    if test $status -eq 0
        say -v Samantha "$last_cmd finished"
    else
        say -v Samantha "$last_cmd failed"
    end
end

使用时直接保持原有习惯:docker-compose build; sr,函数会自动提取docker-compose build并播报对应的结果。

纯Fish内置工具方案(无外部依赖)

如果不想依赖awk,可以用Fish自带的string工具实现更安全的解析:

function sr
    set last_line (history --max 1)
    # 优先找分号的位置,没有则找逻辑与运算符
    set cmd_end (string index -of ';' $last_line)
    if test -z $cmd_end
        set cmd_end (string index -of '&&' $last_line)
    end
    
    # 截取并整理命令内容
    if test -n $cmd_end
        set last_cmd (string substring -l (math $cmd_end - 1) $last_line | string trim)
    else
        set last_cmd $last_line
    end

    if test $status -eq 0
        say -v Samantha "$last_cmd finished"
    else
        say -v Samantha "$last_cmd failed"
    end
end

替代方案:显式传递命令参数

如果自动解析遇到复杂命令(比如命令本身包含分号),显式传参的方式更可靠:

function sr
    set cmd $argv[1]
    if test $status -eq 0
        say -v Samantha "$cmd finished"
    else
        say -v Samantha "$cmd failed"
    end
end

使用时写成:docker-compose build; sr "docker-compose build",虽然需要重复输入命令,但逻辑清晰,不会出现解析错误。

注意事项

  • 上述自动解析方案支持;、&&、||等常见的命令分隔符;
  • 若同行有多个命令(如cmd1; cmd2; sr),会自动提取cmd2作为目标命令;
  • 命令本身包含分隔符时,建议使用显式传参方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:17