arc completion 為你的 shell 生成一份 tab 補全指令碼,打到 stdout。它從不往磁碟上寫任何東西——把輸出變成一個檔案,或者追加進你 shell 的啟動檔案,是你自己動手的一步。
對照版本:arc 2.0.0-beta.48(commit 5a5316bde,main,2026-09-10)。複製下面任何內容前先跑 arc --version;生成的指令碼可能隨構建變化。
用法
arc completion [shell]shell:bash、zsh、或fish。省略時arc從$SHELL探測;如果$SHELL沒設定,或者設成了這三者之外的東西,就回落到bash:
$ env -i PATH="$PATH" SHELL=/bin/zsh arc completion | head -1
#compdef arc
$ env -i PATH="$PATH" SHELL=/usr/bin/tcsh arc completion | head -1
###-begin-arc-completions-###生成指令碼
三份指令碼長度不一樣——bash 自己做匹配和轉義,zsh 把大部分工作交給 _describe,fish 只是一次 complete 呼叫:
$ arc completion bash | wc -l
86
$ arc completion zsh | wc -l
67
$ arc completion fish | wc -l
14三個合法值之外的 shell 名字,會像任何其它非法 choice 取值一樣被拒絕——一個 yargs 校驗錯誤,exit 5:
$ arc completion nosuchshell
ERROR: Invalid values:
Argument: shell, Given: "nosuchshell", Choices: "bash", "zsh", "fish"(此處截斷——剩下的部分和 arc completion --help 列印的文本相同)
怎麼裝
每份指令碼自己的開頭註釋都寫了該怎麼裝。arc completion <shell> 只列印,不會替你寫到下面任何一個路徑。
bash
arc completion bash >> ~/.bashrcmacOS 上改用 ~/.bash_profile,腳本里的註釋寫的就是這個。開一個新 shell,或者 source 這個檔案,就能生效。
zsh
arc completion zsh >> ~/.zshrc如果你的 ~/.zshrc 從沒跑過 compinit,指令碼第一次載入時會自己引導它,你不需要另外加這一步。它還會在每個 prompt 上重新註冊自己,這樣你環境裡後面某處再跑一次 compinit 重建補全表時,不會悄悄把 arc 這條丟掉。
fish
mkdir -p ~/.config/fish/completions
arc completion fish > ~/.config/fish/completions/arc.fishmkdir -p 這一步很關鍵——> 不會自動建父目錄,而 fish 只認已經在 ~/.config/fish/completions/ 裡面的補全檔案。
能補全什麼
在下面任何一種位置按 Tab,裝好的指令碼都會去問正在跑的那個 arc 二進位制該給什麼——所以答案永遠匹配你實際裝的那個二進位制,不是生成指令碼那一刻定住的快照:
- 命令名 ——
arc d<TAB>給出did、deploy、drain、dsl - 子命令名 ——
arc did <TAB>給出init、check、issue、verify、info、list、issuer --instance/-i取值 —— 和arc service list會顯示的同一批名字,所以arc service status -i <TAB>只會給出你真的有的例項--recipe/--template取值 ——arc blocklet create --recipe <TAB>給出和arc blocklet create --help列出的一樣的選項:basic、blank、blog、agent、minimal-app、agent-workspace、support-community
除此之外的位置——比如 arc afs ls <TAB> 裡的 AFS 路徑——不屬於上面任何一個槽位,指令碼會落回你 shell 自帶的普通檔名補全。
取值怎麼落到命令列上
例項名和 recipe 名不是生成指令碼那一刻定住的。每按一次鍵都會去查詢你現在實際裝的那個 arc 二進位制,所以上週生成的指令碼,照樣能給出你五分鐘前才建的例項。
不管取值裡是什麼字元,插入這一步也是安全的。bash 在插入每個候選值之前都用 printf %q 轉義,所以一個字面上叫 my prod box 的例項,補全出來是安全的三段詞 my\ prod\ box,不會拆成三個獨立的詞;一個含 shell 元字元的名字,永遠不會被未轉義地交給 shell。zsh 的 _describe 內建了同樣的性質。
退出碼
| 你跑了什麼 | 退出碼 |
|---|---|
arc completion bash / zsh / fish | 0 |
arc completion(不帶引數,探測到的 shell) | 0 |
arc completion <其它任何值> | 5 |