12
0

终端集成AI助手

2026-05-16
2026-05-27
AI
AI / Linux
终端集成AI助手

之前在网页上使用阿里云远程连接功能连接服务器,发现它居然集成了AI自然响应,试用了一下非常舒服,如下图所示:

当时是直接叫它教我linux命令,边实战边学习,学起来非常舒服。但我发现关闭再打开之后,之前的记忆就都丢失了,而且web端使用有一点小卡顿,不是很跟手,就想着能不能直接把我的服务器改造成类似阿里这种既能输命令又能输自然执行的AI终端。

一开始我在找市面上的方案,比如现成的软件或者插件之类的,结果发现它们都是单独开一个AI会话窗口,而不是直接集成到终端上,体验不够丝滑。直到我想到直接在服务器上作改动,而shell-gpt很好地满足了我的需求。具体安装配置过程如下:

1.安装 shell-gpt

安装方法其实非常简单,执行一行命令即可:

pip install shell-gpt

但直接用 pip install 可能会遇到环境冲突的警告(WARNING: Running pip as the 'root' user...)。作为追求优雅的开发者,我建议采用现代的 pipx 来进行隔离安装:

# 1. 安装 pipx
sudo apt update && sudo apt install pipx

# 2. 将 pipx 及其安装的工具加入到环境变量
pipx ensurepath
source ~/.bashrc  

# 3. 安全安装 shell-gpt
pipx install shell-gpt

pipx是目前 Python 圈子里专门用来安装全局命令行工具(CLI)的现代标准神器。它会在后台默默建一个独立的虚拟环境把 shell-gpt 隔离起来,但又会自动把 sgpt 命令暴露到系统的全局 PATH 里供用户,堪称完美。

2.配置大模型 API

shell-gpt 默认连接的是 OpenAI 的服务器,这里我选择将其底层替换为阿里云的通义千问(Qwen)模型。

先在终端随便敲一句 sgpt "hi" 触发初始化,此时它会让你输入 API Key,把自己的 Key 贴进去。(当然,也可以直接在接下来的配置文件中更改)

接下来修改生成的配置文件:

vim ~/.config/shell_gpt/.sgptrc

将里面的请求地址和模型改成兼容协议的配置:

# 替换为国内大模型的兼容接口,这里以通义千问为例
API_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
DEFAULT_MODEL=qwen-plus

保存并退出后我们shell-gpt就能用了,如sgpt "hello"

3.注入灵魂 —— 彻底告别前缀

虽然能用,但每次输入自然语言都要加sgpt,与阿里的体验还是不同,这时就要用到本次改动最核心的魔法了!

利用 Linux 系统的 command_not_found_handle 钩子函数,我们可以拦截所有系统看不懂的“大白话”,并自动移交给 AI 处理。

同时,为了解决上下文混乱的问题,我利用全局变量手搓了一个“频道切换”功能,体验直逼网页版侧边栏!

打开 ~/.bashrc,在末尾添加以下配置:

# ==========================================
# 专属 AI 终端副驾驶 (多会话管理版)
# ==========================================

# 1. 设定默认的聊天窗口
export SGPT_CHAT_SESSION="linux_learning"

# 2. 快捷命令:aic 用来无缝切换聊天窗口
aic() {
    if [ -z "$1" ]; then
        echo "当前所处频道: $SGPT_CHAT_SESSION"
        echo "用法: aic <频道名> (例如: aic java_study)"
    else
        export SGPT_CHAT_SESSION="$1"
        echo "✅ 网页级切换:已无缝切入会话 [$SGPT_CHAT_SESSION]"
    fi
}

# 3. 快捷命令:ails 用来查看所有历史会话(类似网页左侧边栏)
alias ails="sgpt --list-chats"
# 4. 快捷命令:chat 用于沉浸式纯聊天(不执行系统命令)
alias chat='sgpt --chat "$SGPT_CHAT_SESSION"'

# 5. 核心魔法:零前缀命令拦截器
command_not_found_handle() {
    # 动态获取当前目录,让 AI 具备空间感知能力
    local current_dir=$(pwd)
    local sys_prompt="[当前所在目录: $current_dir] "
    
    echo "🤖 当前频道 [$SGPT_CHAT_SESSION] | 大脑飞速运转中..."
    sgpt --chat "$SGPT_CHAT_SESSION" --shell "$sys_prompt $*"
}

保存并执行 source ~/.bashrc 生效。这下能aic创建会话,ails 查看会话,同时还支持记忆功能,一个小型但完整的AI终端助手就搞定了!

4.实战体验

配置完成后,面对纯黑的命令行,不要加任何前缀,直接输入: 帮我查一下哪个进程占用了 8080 端口

按下回车,系统不会报错,而是瞬间返回 lsof -i :8080netstat 命令,并在下方贴心地给出 [E]xecute, [M]odify, [D]escribe, [A]bort: 的执行确认选项。按 e 即可直接运行,行云流水!(当然,正常的shell命令可以直接执行,而不会走sgpt通道)

意外之喜:与 Linux 管道(Pipe)的完美融合

在使用过程中,我还发现了一个极其惊喜的隐藏玩法。由于这套 Hook 完全遵循 Unix 哲学,它能完美接住正常 Linux 命令的管道输出。

比如,当我看不懂内存状态时,只需执行:

free -h | 帮我分析一下现在的内存健康状态

前方的 free -h 正常执行,结果顺着管道流向后方,AI 会自动捕获这些真实数据,并结合我的大白话给出极其精准的分析诊断。

如下图所示:

(相关改进持续更新中~)


更新时间:2026.5.24

更新内容:让“aic”命令能显示当前会话记忆文件的大小,以便更好地监控上下文长度,在上下文达到一定限度时切换新会话。

会话文件大小建议(200K上下文模型):

  • 小于 50KB(约 3.5 万 Token):黄金运行期。AI 响应极快,记忆精准,随便折腾。

  • 50KB ~ 100KB(约 3.5万 ~ 7万 Token):成熟期。开始出现微小的响应停顿,可以考虑让它做个总结。

  • 大于 150KB衰退期。大模型需要处理的冗余信息过多,可以让它“吐出 Markdown 笔记”后,无痛转到其他频道。

feat:“aic”命令加入当前会话文件体积

/tmp 目录在服务器重启时会清空,shell_gpt默认的缓存与会话缓存就是放在此目录下的,所以我们先修改一下存储位置:

cd ~/.config/shell_gpt
vim .sgptrc

在此文件中修改以下配置:

CHAT_CACHE_PATH=/root/.config/shell_gpt/chat_cache
CACHE_PATH=/root/.config/shell_gpt/cache

~/.bashrc 下进行修改:

aic() {
    # 【注意】把这里改成你的会话缓存实际路径
    local cache_dir="/root/.config/shell_gpt/chat_cache"
    
    if [ -z "$1" ]; then
        echo "当前所处频道: $SGPT_CHAT_SESSION"
        
        # 核心监控逻辑:查阅当前频道大小
        local file_path="$cache_dir/$SGPT_CHAT_SESSION"
        if [ -f "$file_path" ]; then
            # 使用 awk 提取 du 命令输出的第一列(纯数字+单位)
            local size=$(du -sh "$file_path" | awk '{print $1}')
            echo "📊 上下文负荷: $size"
        else
            echo "📊 上下文负荷: 0KB (记忆为空)"
        fi
        
        echo "用法: aic <频道名> (例如: aic java_study)"
    else
        export SGPT_CHAT_SESSION="$1"
        echo "✅ 网页级切换:已无缝切入会话 [$SGPT_CHAT_SESSION]"
        
        # 顺水推舟:切换新频道后,立刻播报新频道的重量
        local file_path="$cache_dir/$SGPT_CHAT_SESSION"
        if [ -f "$file_path" ]; then
            local size=$(du -sh "$file_path" | awk '{print $1}')
            echo "📊 当前频道负荷: $size"
        else
            echo "✨ 这是一个全新的空白频道,请开始你的表演!"
        fi
    fi
}

改动说明:

  1. 静默容错 (if [ -f "$file_path" ]):这是一个非常关键的防御性编程习惯。如果这个频道是刚刚 aic 出来的,还没说过话,硬盘上是不存在这个文件的。加上判断就能优雅地输出“0KB”,而不是让终端喷满红色的 No such file or directory

  2. 纯净输出 (awk '{print $1}'):原生执行 du -sh 会输出类似 14K /tmp/chat_cache/linux_learning。加上这截管道后,输出就会变成极其清爽的 14K

  3. 双向播报:不仅在不加参数纯查看时会显示大小,在你切换到另一个频道的一瞬间,也会顺带把新频道的体重报给你,让你随时对上下文的“内存水位”心中有数。

保存修改后,执行一次 source ~/.bashrc。直接敲个 aic 看看这套属于你的定制版“AI 终端仪表盘”效果吧!


更新时间:2026.5.27

更新内容:突破 sgpt 原生 --shell 参数的系统提示词限制,将拦截器底层接管逻辑替换为 ShellGPT 角色(Role),实现更深度的环境感知与命令定制。

关于原生 --shell 参数的局限性:

在之前的配置中,我们使用 sgpt --shell 来处理自然语言。但 --shell 底层实际上调用了官方硬编码的系统提示词,每次注入的提示词都是 Shell Command Generator.json 里的。这次我们改进一下,使得可以在配置里自己调整role。

refactor:零前缀核心拦截器引入 Role

要实现这个底层魔法,首先需要确保 ~/.config/shell_gpt/roles/ 目录下有你想改的角色配置文件,官方一开始提供四个。这里我们改成 ShellGPT.json 角色。

接着,我们需要修改 ~/.bashrc 中的拦截逻辑:

Bash

vim ~/.bashrc

找到之前的拦截器代码,将核心执行逻辑替换为以下配置:

Bash

# 5. 核心魔法:零前缀命令拦截器 (自定义 ShellGPT Role 版)
command_not_found_handle() {
    # 动态获取当前目录,让 AI 具备空间感知能力
    local current_dir=$(pwd)
    local sys_prompt="[当前所在目录: $current_dir] "
    
    echo "🤖 当前频道 [$SGPT_CHAT_SESSION] | 大脑飞速运转中..."
    
    # 核心改动:不用之前的 --shell,强行注入专属的 --role "ShellGPT"
    sgpt --chat "$SGPT_CHAT_SESSION" --role "ShellGPT" "$sys_prompt $*"
}

改动说明:

  1. 绝对主控权 (--role "ShellGPT"):替换参数后,拦截器触发时会精准读取本地 ShellGPT.json 中的设定,可替换为自己的系统提示词。

  2. 神级上下文缝合 ($sys_prompt $*):这次底层不仅完美保留了 --chat 带来的多频道历史会话记忆,还通过 $sys_prompt 继续将当前工作目录(pwd)传递给大模型,让终端 AI 依然保持极强的空间感知能力。

保存修改后,执行一次 source ~/.bashrc 即可生效。

命令解释:

  • --role "ShellGPT" (真正的系统提示词 System Prompt): 这是全局的“人设”和“规则”,存放在本地的 JSON 文件里。ShellGPT 在底层调用 API 时,会把这部分内容放在消息数组的最顶端(通常是 {"role": "system", "content": "..."})。

  • $sys_prompt (局部上下文前缀): 这是我自己定义的一个变量 [当前所在目录: /root/xxx]。它并不是系统提示词,它只是在每次敲击键盘时,物理拼接在了提问($*)前面。

评论