Chapter 04

命令行与 CLI 深度使用

深度挖掘 Ollama CLI 的全部能力:交互模式的内置命令、多行输入技巧、管道与非交互模式、批量 Shell 脚本,以及在命令行中维护多轮对话上下文。

交互模式内置命令

进入 ollama run 模型名 后,你会看到 >>> 提示符。除了直接输入问题,还有一套以 / 开头的内置命令来控制会话:

# 启动交互模式
ollama run llama3.2

# 进入交互模式后可用的内置命令:

# /help — 显示所有可用命令列表
>>> /help

# /show info — 查看当前加载模型的详细信息
>>> /show info
# 输出:arch=llama, parameters=3.2B, context=131072, ...

# /show modelfile — 查看当前模型的 Modelfile
>>> /show modelfile

# /set parameter — 临时修改生成参数(本次会话有效)
>>> /set parameter temperature 0.1
>>> /set parameter num_ctx 4096
>>> /set parameter seed 42      # 固定随机种子,结果可复现

# /set system — 临时修改系统提示词
>>> /set system "你是一个诗人,只用古诗风格回答"

# /set nohistory — 不记录此次对话历史(隐私模式)
>>> /set nohistory

# /save — 保存当前会话状态为一个新模型
>>> /save my-session-snapshot

# /load — 加载已保存的会话状态
>>> /load my-session-snapshot

# /clear — 清除当前对话历史(重置上下文)
>>> /clear

# /bye — 退出交互模式(或按 Ctrl+D)
>>> /bye

多行输入技巧

在交互模式中,有多种方式输入跨越多行的内容:

# 方式一:三引号包裹(推荐,最清晰)
>>> """
... 请分析以下代码的性能问题:
...
... def slow_function(n):
...     result = []
...     for i in range(n):
...         result = result + [i * 2]  # 每次创建新列表
...     return result
...
... """
# 输入第二个 """ 并按 Enter 提交

# 方式二:行尾反斜杠续行
>>> 分析这段代码:def f(x): \
...     return x * 2

# 方式三:从文件读取输入(非交互模式更实用)
# 先将问题写入文件
cat > /tmp/question.txt << 'EOF'
审查以下 Python 代码,指出潜在的安全漏洞和改进建议:

```python
import sqlite3

def get_user(username):
    conn = sqlite3.connect("users.db")
    query = f"SELECT * FROM users WHERE name = '{username}'"
    result = conn.execute(query).fetchone()
    conn.close()
    return result
```
EOF

# 管道模式输入文件内容
ollama run llama3.2 < /tmp/question.txt

管道与非交互模式

非交互模式是自动化任务的核心。Ollama 检测到标准输入不是终端(TTY)时,自动进入非交互模式:

# 最基础的非交互用法
echo "用一句话解释量子纠缠" | ollama run llama3.2

# 传入变量
LANG="Python"
echo "用 ${LANG} 实现冒泡排序" | ollama run qwen2.5:7b

# 处理文件内容(代码审查)
cat main.py | ollama run codepal "审查以上代码,指出问题"

# 管道串联:先生成再格式化
echo "列出 5 个 Python 最佳实践,用 JSON 格式返回" | \
  ollama run llama3.2 | \
  python3 -c "import sys, json; data=json.loads(sys.stdin.read()); print(json.dumps(data, indent=2, ensure_ascii=False))"

# 命令行直接传 prompt(推荐方式)
ollama run llama3.2 "翻译成英文:量子计算改变了我们对计算的理解"

# 输出重定向到文件
ollama run llama3.2 "写一个 Python 爬虫的完整示例" > crawler_example.py

# 获取纯文本输出(去掉流式的特殊字符)
RESPONSE=$(ollama run llama3.2 "给出 3 个随机数字,只返回数字用逗号分隔")
echo "模型返回:$RESPONSE"

批量处理脚本实战

利用非交互模式,可以轻松构建批量处理工作流:

#!/bin/bash
# batch_translate.sh — 批量翻译目录下的 .txt 文件

MODEL="qwen2.5:7b"
INPUT_DIR="./docs"
OUTPUT_DIR="./docs_translated"

mkdir -p "$OUTPUT_DIR"

for file in "$INPUT_DIR"/*.txt; do
  filename=$(basename "$file" .txt)
  echo "正在翻译:$filename"

  # 读取文件内容,拼接翻译指令
  CONTENT=$(cat "$file")
  PROMPT="将以下文本翻译成中文,保持专业术语准确,只输出翻译结果不要解释:

${CONTENT}"

  # 调用 Ollama 翻译,输出到新文件
  echo "$PROMPT" | ollama run "$MODEL" > "${OUTPUT_DIR}/${filename}_zh.txt"

  echo "  ✓ 完成:${OUTPUT_DIR}/${filename}_zh.txt"
  sleep 0.5  # 避免请求过快
done

echo "批量翻译完成!共处理 $(ls $INPUT_DIR/*.txt | wc -l) 个文件"
#!/bin/bash
# code_review.sh — 自动审查 Git 提交的修改文件

MODEL="codepal"  # 使用第3章创建的编程助手

# 获取最新提交修改的 Python 文件
CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD | grep '\.py$')

if [ -z "$CHANGED_FILES" ]; then
  echo "没有 Python 文件变更"
  exit 0
fi

for file in $CHANGED_FILES; do
  echo "======================================"
  echo "审查文件:$file"
  echo "======================================"

  DIFF=$(git diff HEAD~1 HEAD -- "$file")
  PROMPT="以下是代码变更的 diff,请简要审查:
1. 潜在的 Bug 或错误
2. 性能问题
3. 不符合 PEP8 的代码风格

\`\`\`diff
${DIFF}
\`\`\`

只列出发现的问题,没有问题就说'代码看起来没有明显问题':"

  echo "$PROMPT" | ollama run "$MODEL"
  echo ""
done

会话上下文管理

在交互模式中,Ollama 会自动维护对话历史(多轮上下文),但有一些重要细节需要了解:

# 默认情况:Ollama 会话保持上下文(多轮对话)
>>> 我叫小明,我想学 Python
>>> 你好小明!Python 是一门...
>>> 我应该从哪里开始?
>>> (模型记得你叫小明,会说"小明,建议你从...")

# 上下文长度受 num_ctx 参数限制
# 当对话超出 num_ctx token 限制时,会自动截断最旧的内容
# 通过 /set parameter num_ctx 增大上下文(需要更多内存)
>>> /set parameter num_ctx 32768

# 清除上下文(开始新话题时)
>>> /clear

# 保存当前会话状态(包含所有上下文)
>>> /save work-session-20250409

# 下次恢复该会话(继续之前的对话)
ollama run llama3.2
>>> /load work-session-20250409
>>> 继续我们刚才讨论的 Python 异步编程话题

# 非交互模式默认无上下文(每次独立请求)
# 若需要在脚本中保持上下文,使用 REST API 的 /api/chat 接口(见第5章)
高效 CLI 工作流技巧~/.bashrc~/.zshrc 中添加常用别名: alias ask='ollama run qwen2.5:7b',之后用 ask "问题" 即可快速查询。还可以创建函数 codehelp() { cat "$1" | ollama run codepal "审查此文件"; },然后用 codehelp main.py 一键审查代码。
非交互模式的编码问题 在 Linux/macOS 系统中,如果输入含中文,确保终端和脚本使用 UTF-8 编码(export LANG=en_US.UTF-8)。在 Windows 中使用管道时,可能需要 chcp 65001 切换到 UTF-8 代码页,否则中文会乱码。
本章小结 CLI 深度使用要点:交互模式用 /set parameter 临时调参,/save//load 保存恢复会话;非交互模式(echo/cat + 管道)是自动化的基础;批量处理脚本可实现翻译、代码审查、文档生成等工作流。下一章深入 REST API,解锁更强大的集成能力。