# Khởi động Claude Code

> Khởi động Claude Code bằng bất kỳ tài khoản nào với ccam <name|number>, ccam run hoặc bộ chọn của ccam; các đối số được chuyển nguyên vẹn cho claude, và --dry-run hiển thị lệnh.

Source: https://ccam.dev/vi/features/launch/ · Updated 2026-10-19

`ccam work` khởi động Claude Code bằng tài khoản `work`, và mọi thứ sau tên được chuyển nguyên vẹn cho `claude`. Hãy dùng nó ở bất cứ đâu bạn vẫn gõ `claude`: trong terminal, trong script, hoặc khi có đầu vào được pipe vào.

## Cách dùng

```sh
ccam work                        # Claude Code as the account work
ccam 2                           # the account with number 2 (see ccam list)
ccam work --resume               # claude --resume, as work
ccam work -p "fix the tests" --output-format json
cat log.txt | ccam work -p "find the cause"
ccam -p "summarise"              # no name: the default account
ccam use work                    # make work the default account
ccam run work --continue         # same as ccam work --continue
ccam                             # the picker on a terminal, the list otherwise
ccam --dry-run work -p hi        # print the command instead of running it
```

Hãy đưa tên của một tài khoản hoặc số của nó trong `ccam list`. ccam không đọc các đối số sau tên, nên `ccam work --help` hiển thị trợ giúp của Claude Code. Dấu `--` sau tên là không bắt buộc. Đầu vào chuẩn, mã thoát và tín hiệu hoạt động giống như với `claude`.

Khi đối số đầu tiên bắt đầu bằng `-` và không phải một cờ của chính ccam, ccam khởi động tài khoản mặc định với tất cả các đối số. Tài khoản mặc định là tài khoản được đặt bằng `ccam use`, hoặc tài khoản có số thấp nhất nếu bạn chưa đặt.

### Bộ chọn

`ccam` không kèm đối số sẽ mở bộ chọn khi đầu vào và đầu ra chuẩn là terminal, và in ra `ccam list` trong các trường hợp khác. Bộ chọn hiển thị số, email, mức sử dụng 5 giờ, lần dùng gần nhất và các mục dùng chung của từng tài khoản; mức sử dụng được điền vào khi từng tài khoản phản hồi.

| Phím | Tác dụng |
| --- | --- |
| `Enter` | Khởi động Claude Code bằng tài khoản đang chọn |
| `1` đến `9` | Khởi động tài khoản có số đó |
| `Up`/`Down`, `k`/`j` | Di chuyển lựa chọn |
| `a` | Đóng bộ chọn và chạy trình hướng dẫn `ccam add` |
| `s` | Sửa các mục dùng chung của tài khoản đang chọn (`Space` hoặc `x` để bật/tắt, `Enter` để áp dụng, `Esc` để quay lại) |
| `d` | Đặt tài khoản đang chọn làm mặc định |
| `r` | Lấy lại mức sử dụng, không dùng bộ nhớ đệm ngắn hạn |
| `q`, `Esc`, `Ctrl+C` | Thoát |

Bộ chọn đóng lại trước khi thực hiện thao tác, nên terminal được khôi phục trước khi Claude Code khởi động. Sau `d` hoặc một thay đổi về dùng chung, bộ chọn mở lại. Thay đổi về dùng chung sẽ hiển thị kế hoạch và hỏi trước, như `ccam share`.

## Tùy chọn

| Tùy chọn | Tác dụng | Mặc định |
| --- | --- | --- |
| `--dry-run` | In ra biến môi trường và lệnh mà ccam sẽ chạy, rồi thoát | tắt |
| `-v`, `--version` | In ra `ccam <version>` (chỉ khi là đối số đầu tiên) | |
| `-h`, `--help` | Trợ giúp của ccam, dưới dạng `ccam --help` hoặc `ccam run --help` | |

Quy tắc về đối số:

- ccam chỉ đọc cờ của chính nó ở trước tên tài khoản. Sau tên, mọi đối số đều thuộc về Claude Code, kể cả `--dry-run` và `--help`.
- `--dry-run` hoạt động dưới dạng `ccam --dry-run work`, `ccam run --dry-run work` và `ccam --dry-run` (tài khoản mặc định). Nó được hỗ trợ, không bị từ chối.
- `ccam run <name|number> [claude args]` là dạng đầy đủ của `ccam <name>`. `ccam run` không kèm tên sẽ dùng tài khoản mặc định.
- Tên tài khoản không được trùng với tên lệnh của ccam như `add`, `list`, `run` hoặc `usage`, nên `ccam <word>` không bao giờ mơ hồ.

Lần chạy thử in ra một dòng mà bạn có thể dán vào shell:

```console
$ ccam --dry-run work -p "fix the tests"
CLAUDE_CONFIG_DIR=/home/me/.local/share/ccam/profiles/work /home/me/.local/bin/claude --mcp-config=/home/me/.local/share/ccam/groups/default/mcp.json -p 'fix the tests'
```

## Cách hoạt động

Mỗi lần khởi động đi qua cùng các bước, từ dòng lệnh đến `exec`:

Mỗi ô sáng lên khi bước của nó chạy, và các dòng bên dưới là biến môi trường và đối số mà Claude Code khởi động cùng.

1. `cmd/ccam/main.go` gọi `app.Main`. Nếu ccam được khởi động dưới một tên khác, đó là một [lệnh tắt](https://ccam.dev/vi/features/shortcuts.md) và đi thẳng tới trình khởi chạy.
2. `app.parse` xem `os.Args` trước khi cobra tham gia. Chỉ `ccam` đứng một mình (bộ chọn), một tên lệnh của ccam (`config.Reserved`), `-h`/`--help` và `-v`/`--version` mới đi tới `cli.Execute`. Mọi thứ khác là một lần khởi động.
3. `launcher.Launch` đọc `~/.config/ccam/config.toml`, tệp duy nhất nó phân tích.
4. `launcher.Prepare` tìm tài khoản theo tên hoặc số, bỏ một dấu `--` đứng đầu, và tìm tệp thực thi `claude` bằng `ResolveClaude`. Kết quả tra cứu PATH được lưu đệm trong `~/.local/state/ccam/claude-path` cùng với thời điểm sửa đổi của tệp, nên ccam không phải tìm trong `PATH` ở mỗi lần khởi động. Tệp bị thay đổi hoặc không còn sẽ kích hoạt một lần tra cứu mới. Đường dẫn `claude_bin` trong `config.toml` được dùng nguyên như vậy. ccam từ chối một `claude` chính là ccam, so sánh theo inode, vì điều đó sẽ tạo vòng lặp.
5. `checkLinks` so sánh thư mục tài khoản `~/.local/share/ccam/profiles/<name>/` với thiết lập dùng chung của nó bằng `share.Check`, hàm này chỉ gọi `lstat` và `readlink`, một hoặc hai lời gọi hệ thống cho mỗi mục. Liên kết còn thiếu được tạo ngay lập tức. Bất cứ thứ gì có thể làm mất dữ liệu đều dừng việc khởi động.
6. `applyMCP` thêm các máy chủ MCP dùng chung (xem bên dưới).
7. `session.Register` ghi lại phiên. ccam ghi một tệp đánh dấu đặt tên theo PID của nó, chứa thời điểm bắt đầu tiến trình, vào `$XDG_RUNTIME_DIR/ccam/profile-<name>/<pid>` (hoặc `~/.local/state/ccam/locks/` khi không có `XDG_RUNTIME_DIR`). Với tài khoản dùng chung lịch sử hội thoại, `historyCheck` trước tiên tìm một phiên đang chạy trong `history-<group>-<hash>`, trong đó hash là của thư mục hiện tại, và cũng đăng ký ở đó. `exec` giữ nguyên PID, nên khi đó tệp đánh dấu chỉ đúng tiến trình Claude Code. Dùng tệp đánh dấu chứ không giữ khóa, vì các tiến trình do Claude Code khởi động sẽ thừa hưởng khóa và giữ nó sau khi phiên kết thúc.
8. `Plan.Exec` đặt tiêu đề terminal thành `claude · <name>` (khi đầu ra lỗi chuẩn là terminal), ghi thời điểm khởi động vào `~/.local/state/ccam/last-used/<name>` mà không `fsync`, và gọi `syscall.Exec`.

Claude Code chạy với `CLAUDE_CONFIG_DIR` trỏ tới thư mục tài khoản và `CCAM_PROFILE` là tên tài khoản. ccam xóa mọi giá trị của các biến này mà nó thừa hưởng. Với một thư mục `~/.claude` được đăng ký bằng `ccam import` trên macOS, nó còn đặt `CLAUDE_SECURESTORAGE_CONFIG_DIR` thành giá trị rỗng, để tài khoản và `claude` thông thường dùng cùng một thông tin đăng nhập trong Chuỗi khóa (Keychain).

### Vì sao dùng exec

`syscall.Exec` thay tiến trình ccam bằng `claude`, nên ccam không ở lại trong bộ nhớ, phím bấm, tín hiệu và mã thoát là của chính Claude Code, và đối số luôn là một mảng, không bao giờ là chuỗi shell. Công việc sau một phiên, như phát hiện các máy chủ được thêm bằng `claude mcp add`, diễn ra ở lần khởi động tiếp theo: ccam so sánh thời điểm sửa đổi của `.claude.json` với `~/.local/state/ccam/mcp/<name>/seen` và chỉ phân tích tệp khi nó đã thay đổi.

### Cách một dòng lệnh được định tuyến

Ba dòng lệnh, ba đường đi qua `internal/app`:

Lệnh tắt được nhận ra qua `argv[0]`, `ccam <name>` qua đối số đầu tiên, và cả hai đều kết thúc ở `syscall.Exec`. Chỉ một lệnh của ccam như `ccam usage` mới đến cobra.

### Máy chủ MCP dùng chung

Với chiến lược mặc định `flag`, ccam truyền các máy chủ MCP của nhóm cho Claude Code dưới dạng một đối số, đặt trước các đối số của bạn:

`mcp.FlagArgs` chỉ trả về một đối số nếu `mcp.json` của nhóm tồn tại, và `Plan.InsertArgs` đặt nó ngay sau `claude`. Khi đó `--mcp-config` hoặc `--strict-mcp-config` của riêng bạn vẫn được áp dụng chồng lên. Đó là một đối số duy nhất, `--mcp-config=<path>`, vì `--mcp-config` của Claude Code nhận nhiều giá trị: nếu viết thành hai đối số, nó sẽ đọc cả lời nhắc theo sau như một tệp cấu hình.

Với `mcp_strategy = "sync"` trong `config.toml`, ccam ghi các máy chủ vào `.claude.json` của tài khoản thay vào đó, và bỏ qua việc này nếu tài khoản đang chạy.

### Ngân sách 10 ms

ccam thêm tối đa 10 ms (p95) trước khi Claude Code khởi động. Đường khởi động không bao giờ dựng cây lệnh cobra, khởi động Bubble Tea hay mở kết nối mạng, và `TestPackageInitIsCheap` thất bại nếu các hàm `init()` của gói mất tổng cộng hơn 5 ms. `scripts/perf-check.sh` đo `ccam --dry-run work`, `ccam work` và một lệnh tắt bằng `hyperfine` và thất bại khi vượt 10 ms, còn `BenchmarkLaunchPath` trong `internal/launcher` chạy các bước trong một vòng lặp. Để xem thời gian của từng bước, hãy đặt `CCAM_TRACE=1`:

```console
$ CCAM_TRACE=1 ccam --dry-run work >/dev/null
ccam trace: start                 2.830ms (total 2.830ms)
ccam trace: load config           0.397ms (total 3.227ms)
ccam trace: prepare               0.112ms (total 3.339ms)
ccam trace: check links           0.238ms (total 3.578ms)
ccam trace: prelaunch             0.083ms (total 3.661ms)
```

## An toàn và các trường hợp đặc biệt

- Một tên hoặc số không xác định sẽ dừng với `no account "<name>"` và chỉ tới `ccam list`. Khi chưa có tài khoản nào, ccam yêu cầu bạn thêm một tài khoản bằng `ccam add <name>`.
- Nếu một đường dẫn dùng chung đã trở thành tệp thông thường hoặc trỏ sai chỗ, ccam dừng với `stopped because of share link problems:`, liệt kê chúng, và yêu cầu bạn chạy `ccam doctor --fix`. Nó không di chuyển dữ liệu trên đường khởi động.
- Nếu một Claude Code khác dùng chung lịch sử hội thoại với tài khoản này (cùng nhóm) đang chạy trong cùng thư mục, ccam cảnh báo rằng lịch sử có thể bị trộn lẫn và hỏi `Run anyway? [y/N]`. Khi không có terminal, nó hiển thị cảnh báo và tiếp tục.
- `--dry-run` bỏ qua việc đồng bộ MCP, thông báo máy chủ mới, kiểm tra lịch sử, tệp đánh dấu phiên, tiêu đề và thời điểm dùng gần nhất, và không exec. Nó vẫn kiểm tra liên kết dùng chung, và tạo liên kết còn thiếu như một lần khởi động bình thường.
- Với `mcp_strategy = "sync"`, việc đồng bộ thất bại sẽ in ra `ccam: MCP sync failed (launching anyway): …` và Claude Code khởi động với các máy chủ nó đã có.

## Liên quan

- [Lệnh tắt](https://ccam.dev/vi/features/shortcuts.md)
- [Quản lý tài khoản](https://ccam.dev/vi/features/accounts.md)
- [Tham chiếu lệnh](https://ccam.dev/vi/docs/commands.md)
- [Dùng chung máy chủ MCP, cài đặt và lịch sử](https://ccam.dev/vi/docs/sharing.md)
- [Cách CLAUDE_CONFIG_DIR hoạt động](https://ccam.dev/vi/guides/claude-config-dir.md)
