Linux基础系列文章大纲 Shell系列文章大纲
AI在终端: Shell-GPT AI遍布各个领域,终端上也不例外。
在终端上,我经常不知道一个未曾使用过的命令用法,或者会忘记命令的选项参数,又或者我不熟悉PowerShell/CMD,但有时候想在PowerShell/CMD上执行一些简单的必要操作。以前需要查文档、搜网页,现在可以直接在终端上向AI提问,让它给我显示出满足需求的具体命令行。
项目地址:https://github.com/TheR1D/shell_gpt
安装:
安装好之后,需要设置AI的API,现在deepseek非常便宜,所以我使用deepseek的API。当然,使用其他AI的API也一样的。申请deepseek API: https://platform.deepseek.com/api_keys 。
申请之后,创建sgpt的配置文件~/.config/shell_gpt/.sgptrc
(如果是Windows,则在C:\Users\<USERNAME>\.config\shell_gpt\.sgptrc
),并在其中填入Deepseek的API以及API接口。
1 2 3 4 5 OPENAI_API_KEY=<你的API> API_BASE_URL=https://api.deepseek.com/v1 DEFAULT_MODEL=deepseek-chat # 还有很多其他配置变量,可参考项目主页中的解释 # https://github.com/TheR1D/shell_gpt?tab=readme-ov-file
然后就可以使用sgpt
命令来和ai交互了。
简单问答交互 直接将需求描述作为sgpt
命令的参数即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ sgpt '你知道nushell吗,跟bash相比,它有什么优点和缺点' 是的,我知道 Nushell(简称 Nu)。与传统的 Bash 相比,它的优缺点如下: 优点: 1 结构化数据处理:Nu 将数据视为表格(类似 Pandas/Excel),支持 JSON、CSV 等结构化操作,而 Bash 主要处理文本流。 2 跨平台友好:原生支持 Windows/Linux/macOS,Bash 在 Windows 需依赖 WSL 或 Cygwin。 3 现代语法:类似 Python/Rust 的语法,更易读(例如 ls | where size > 1KB)。 4 内置功能:自带常用工具(如 HTTP 请求、数据可视化),减少外部命令依赖。 缺点: 1 性能:处理纯文本流时可能比 Bash 慢(因需解析结构化数据)。 2 兼容性:不直接支持所有 Bash 脚本,需改写。 3 生态:插件和社区资源目前不如 Bash 丰富。 适用场景: • 适合数据处理、跨平台任务;Bash 仍是系统脚本和兼容性的首选。
默认情况下,生成的内容是markdown格式的,而在终端中想要显示markdown文本格式,需要借助额外的工具命令来显示。所以,直接显示内容的时候,如果回答中包含缩进、对齐、居中、表格等格式,显示可能会有点乱。当然,可以使用--no-md
选项来直接输出markdown文本的原文:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 因为sgpt默认会缓存一些回答,因此如果需求不变时,不会再次向AI发请求,而是非常快速地从缓存中取答案 $ sgpt --no-md '你知道nushell吗,跟bash相比,它有什么优点和缺点' 是的,我知道 **Nushell**(简称 Nu)。与传统的 **Bash** 相比,它的优缺点如下: # 1. **结构化数据处理**:Nu 将数据视为表格(类似 Pandas/Excel),支持 JSON、CSV 等结构化操作,而 Bash 主要处理文本流。 2. **跨平台友好**:原生支持 Windows/Linux/macOS,Bash 在 Windows 需依赖 WSL 或 Cygwin。 3. **现代语法**:类似 Python/Rust 的语法,更易读(例如 `ls | where size > 1KB`)。 4. **内置功能**:自带常用工具(如 HTTP 请求、数据可视化),减少外部命令依赖。 # 1. **性能**:处理纯文本流时可能比 Bash 慢(因需解析结构化数据)。 2. **兼容性**:不直接支持所有 Bash 脚本,需改写。 3. **生态**:插件和社区资源目前不如 Bash 丰富。 # - 适合数据处理、跨平台任务;Bash 仍是系统脚本和兼容性的首选。
REPL模式 类似于Python的Repl模式,可以进入一个完全交互式的一问一答会话环境,它有上下文感知。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 # 进入REPL模式,给一个会话名作为参数, # 会话名会保存下来,下次再次进入该会话可继续会话 # 进入repl模式后,Ctrl+C 可退出交互会话 $ sgpt --repl temp Entering REPL mode, press Ctrl+C to exit. # > >> 你知道nushell吗,跟bash相比,它有什么优点和缺点 是的,我知道 Nushell(简称 Nu)。与传统的 Bash 相比,它的优缺点如下: 优点: 1 结构化数据处理:Nu 将数据视为表格(类似 Pandas/Excel),支持 JSON、CSV 等结构化操作,而 Bash 主要处理文本流。 2 跨平台友好:原生支持 Windows/Linux/macOS,Bash 在 Windows 需依赖 WSL 或 Cygwin。 3 现代语法:类似 Python/Rust 的语法,更易读(例如 ls | where size > 1KB)。 4 内置功能:自带常用工具(如 HTTP 请求、数据可视化),减少外部命令依赖。 缺点: 1 性能:处理纯文本流时可能比 Bash 慢(因需解析结构化数据)。 2 兼容性:不直接支持所有 Bash 脚本,需改写。 3 生态:插件和社区资源目前不如 Bash 丰富。 适用场景: • 适合数据处理、跨平台任务;Bash 仍是系统脚本和兼容性的首选。 # > >> Nushell中如何按照字符串长度排序,给出示例 在 Nushell 中,可以结合 sort-by 和 str length 按字符串长度排序。以下是示例: 示例代码: # 假设有一个字符串列表 let strings = ["apple", "banana", "kiwi", "pear"] # 按字符串长度升序排序 $ strings | sort-by { |it| $it | str length } # 降序排序(加 `-r`) $ strings | sort-by -r { |it| $it | str length } 输出示例: # 升序 ["kiwi", "pear", "apple", "banana"] # 降序 ["banana", "apple", "pear", "kiwi"] 说明: • str length 计算字符串长度。 • sort-by 支持闭包({ |it| ... })指定排序依据。 • -r 参数实现降序。 对比 Bash(需依赖 awk 或 wc -m),Nu 的语法更直观且原生支持结构化操作。
会话模式 通过指定会话模式,在会话过程中,会话内容会被保存下来,再次进入会话,之前的会话内容还存在,且在会话模式下可以进行上下文感知。Repl模式实际上是开启了一个会话的。
1 2 3 4 5 6 7 # 开启或进入名为bash_cmd的会话环境 $ sgpt --no-interaction -s --chat bash_cmd '列出当前目录下的普通文件' ls -p | grep -v / # 再次进入bash_cmd会话 $ sgpt --no-interaction -s --chat bash_cmd '按照文件大小进行排序' ls -lS | grep -v '^d'
在sgpt --help
的帮助信息中,可以看到--list-chat
选项可以列出当前保存的会话名,--show-chat
可以输出会话信息和会话历史记录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ sgpt -lc /tmp/chat_cache/temp /tmp/chat_cache/bash_cmd $ sgpt --show-chat temp system: You are Code Generator Provide only code as output without any description. Provide only code in plain text format without Markdown formatting. Do not include symbols such as ``` or ```python. If there is a lack of details, provide most logical solution. You are not allowed to ask for more details. For example if the prompt is "Hello world Python", you should return "print('Hello world')". user: 在Rust中,设置rayon线程池的线程数量 assistant: use rayon::ThreadPoolBuilder; let pool = ThreadPoolBuilder::new() .num_threads(4) .build() .unwrap();
生成命令行 sgpt -s
可以根据描述,生成对应的shell命令。并且sgpt会自动识别当前所在的Shell是什么Shell ,从而给出适合该Shell的命令行。
1 2 3 4 5 6 # -s选项表示根据你的描述,生成对应的shell命令,sgpt会自动识别当前所在的Shell是什么Shell # 如果不使用-s选项,将类似于网页版的会话 $ sgpt -s "搜索extras目录下三天前的.log文件,并且将他们移动到extras/backup目录中,注意搜索的时候不要包含extras/backup目录中的.log文件" # 下面是sgpt给我生成的命令,紧跟着还有一行交互式,输入E执行,输入D说明并解释该命令,输入A退出交互 find extras -path extras/backup -prune -o -type f -name "*.log" -mtime +3 -exec mv {} extras/backup \; [E]xecute, [D]escribe, [A]bort:
如果不想要交互式询问,只是想要让sgpt输出生成的命令,可以加上选项:
1 2 $ sgpt --no-interaction -s '为当前用户(非root)添加sudo免密码配置' echo "$USER ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/$USER && sudo chmod 0440 /etc/sudoers.d/$USER
当然,在Powershell或CMD上也是可以使用sgpt的:
1 2 3 PS C:\Users\longshuai> sgpt -s '从 scoop search 命令的结果中筛选出包含nerd-fonts的行' scoop search | Select-String -Pattern "nerd-fonts" [E]xecute, [D]escribe, [A]bort: E
由于DeepSeek的API会话是有token缓存机制的,命中缓存可以更便宜一点(虽然deepseek已经很便宜了,用来生成几个几十个单词的命令行,基本上和免费也差不多了)。token的缓存是从前向后匹配是否命中的,因此越靠前面的描述尽量不要改,或者在原有的需求描述上追加描述。
可以将这些选项也用在REPL模式下:
1 2 # 将进入temp交互式会话环境,且提问总是输出无需交互的命令,且不是markdown格式的 sgpt -s --no-md --no-interaction --repl temp
生成代码 与生成命令行类似,sgpt当然也可以为我们生成代码,不过由于非Shell代码无法直接在Shell下执行,因此默认是非交互的,而是直接输出代码内容:
1 2 3 4 5 6 7 $ sgpt -c '在Rust中,设置rayon线程池的线程数量' use rayon::ThreadPoolBuilder; let pool = ThreadPoolBuilder::new() .num_threads(4) .build() .unwrap();
同样,可以设置Repl模式下总是生成代码:
1 2 3 4 5 6 7 8 9 10 $ sgpt -c --repl temp Entering REPL mode, press Ctrl+C to exit. > >> > >> 在Rust中,设置rayon线程池的线程数量 use rayon::ThreadPoolBuilder; let pool = ThreadPoolBuilder::new() .num_threads(4) .build() .unwrap();