Cockpit 的"终端"其实是两种气泡:跑 `ls`、`pytest` 用的**一次性命令**气泡,和跑 `bash`、`vim`、`top` 用的完整**交互式终端**气泡。输入栏根据你打的内容自动选对的(详见[命令输入](/zh/docs/console/input-bar/))。

## 一次性命令

打个普通的:

```text
make build
```

气泡打开,命令开跑,输出流式进来。结束后能看到 exit status。气泡留在面板里 —— 滚动看历史输出、复制、内部搜索、重跑都可以。

它能做什么:

- **实时流式** —— 输出随命令产生,不是跑完才出来。
- **保留 ANSI 颜色**。
- **复制输出** —— 气泡标题栏的 📋 图标(复制时去掉 ANSI 转义)。**复制命令本身** —— 标题栏的 📄 图标。
- **`Cmd+F` 搜索** 输出。两种模式可切换:
  - **搜索**:就地高亮匹配。
  - **过滤**:只显示匹配的行,其它都藏。
- **`Ctrl+C` 按钮**(运行中显示在气泡底部状态条/最大化时显示在头部):先给整个进程树(根 PID 及所有子孙)发 `SIGTERM`,1 秒后还活着的发 `SIGKILL` 兜底。
- **运行中喂 stdin** —— 气泡底部状态条有个小输入框给长跑命令传数据:回车送一行、`Tab` 送制表符、`Ctrl+<字符>` 送对应控制字符(`Ctrl+C`、`Ctrl+D` 等都能用)。
- **重跑** 标题栏的 ↻ 图标,不用再打一遍。
- **删除** 标题栏的 ✕ 图标;运行中点删除会先发中断、再清掉气泡。

它不是什么:

- 不是完整 PTY 意义上的交互式。运行需要真正终端的东西(`vim`、`top`、不带参数的 `python`)大概率会坏或卡。这些请用下面的交互式气泡。

## 交互式终端

打一个已知的交互式程序:`zsh`、`bash`、`sh`、`fish`、`nu`、`python`、`python3`、`node`、`irb`、`lua`、`vim`、`nvim`、`vi`、`nano`、`emacs`、`top`、`htop`、`less`、`man`。

真正的终端气泡打开,背后是个 PTY(`nodePty.spawn`)。`vim` 能跑。`top` 能跑。`Ctrl+C` 能用。鼠标选中、复制、粘贴 —— 都能用。

| 功能 | 怎么做 |
|---|---|
| **打字执行** | 在气泡里点一下、开始打。跟你平时的终端一样。 |
| **复制** | 选中文本 —— Cockpit 自动复制(多数环境下不用 `Cmd+C`)。 |
| **粘贴** | `Cmd+V` |
| **搜索** | `Cmd+F` 打开搜索栏 |
| **最大化** | `Cmd+M` 把气泡撑满整个 Console 面板;`Esc` 还原 |
| **停掉进程** | `Ctrl+C` 跟普通终端一样;气泡上的 **Ctrl+C** 按钮发 SIGTERM,1 秒后没退就 SIGKILL |

关闭交互式气泡时进程收到 `SIGTERM`(同样带 SIGKILL 兜底)。气泡的输出历史会保留,除非你点显式的删除按钮。

## 用哪个 shell?

**Cockpit 用你自己的默认 shell**(读 `SHELL` 环境变量,Windows 上读 `COMSPEC`),以 `<shell> --login -c <命令>` 的形式执行 —— 一次性命令和 PTY 气泡都一样。也就是说引号、通配、shell 别名、`~` 展开、`set -e` 之类的行为,全按你 shell 自己的语义。

如果你想临时用别的 shell,**交互式气泡里你自己说了算** —— 打 `zsh`、`bash`、`fish` 都行,Cockpit 不会强行替换。

## 什么时候选哪个

- 想看一条具体命令的输出?**一次性。**
- 想要一个跑好几个命令、维持状态(env、当前目录、history)的会话?**交互式。**
- 跑全屏 TUI 工具(`vim`、`top` 等)?**交互式 —— 只有那里能跑。**
- 跑给 AI 看的命令(聊天里的 `!command`)?**一次性,输出回流到聊天。**

## 下一步

- [命令输入](/zh/docs/console/input-bar/) —— 完整的输入对应表
- [别名与环境变量](/zh/docs/console/aliases-env/) —— 给常用命令起短名
- [CLI 参考 → cockpit terminal](/zh/docs/reference/cli/#cockpit-terminal) —— 从外部驱动终端气泡
