介绍
用 Codex 的人习惯 codex -p 配置名 一键切换不同配置(官方订阅 / 第三方 API 等)。Claude Code 没有原生的「-p 配置名」这种写法——而且它的 -p 参数已经被占用了,意思是 headless(print,非交互式输出)模式,和 Codex 里 -p 表示 profile 完全是两码事。官方切换配置的方式是 --settings <文件路径>,没有更短的原生写法。
这篇教程教你用一段 shell 函数包一层,实现 claude -P 配置名 的一键切换手感:-P(大写)负责选配置,后面跟的所有参数原样透传给真正的 claude,和官方所有 flag 完全兼容。配好后 claude -P xxx、claude -P xxx --resume 都能直接用。

思路:把 –settings 包成一个更顺手的参数
Claude Code 官方的配置切换靠 --settings 指定一个设置文件:
claude --settings ~/.claude/profiles/thirdparty.json
每次手敲这么长一串显然不现实。最省事的做法是写一个 shell 函数,拦截一个不冲突的参数(这里用大写 -P,小写 -p 保留给官方的 headless 模式),把 -P 配置名 翻译成 --settings ~/.claude/profiles/配置名.json,剩下的参数原样透传。
约定:所有配置文件统一放在 ~/.claude/profiles/ 目录下,文件名就是配置名(xxx.json),这样 claude -P xxx 天然对应 ~/.claude/profiles/xxx.json,以后加新配置不用改函数——建个新 json 就能切。
完整代码(最终版)
把下面这段函数加到 shell 的配置文件末尾(Bash 是 ~/.bashrc,Zsh 是 ~/.zshrc):
claude() {
if [[ "$1" == "-P" ]]; then
if [[ -z "$2" ]]; then
echo "Usage: claude -P <profile>" >&2
return 1
fi
local profile="$2"
local settings="$HOME/.claude/profiles/${profile}.json"
shift 2
if [[ ! -f "$settings" ]]; then
echo "Claude profile not found: $profile" >&2
echo "Expected: $settings" >&2
return 1
fi
command claude --settings "$settings" "$@"
else
command claude "$@"
fi
}
四个关键点:
-z "$2"判断放在最前面:防止只打claude -P(后面忘了跟配置名)时,拼出~/.claude/profiles/.json这种奇怪的路径,而是直接给出Usage:提示。local profile/local settings在shift 2之前算出来:这样 shift 丢掉-P和配置名之后,变量值不受影响,不会出现变量丢失。[[ ! -f "$settings" ]]做文件存在性检查:打错配置名(比如claude -P u少打一个字母)时明确报错并返回非零退出码,而不是默默吞掉、莫名其妙走了默认账号。注意检查放在shift 2之后、变量已固定,逻辑最清晰。command claude ...:绕开函数自身,调用真正的 claude 可执行文件,避免递归。
设置步骤
1. 建配置目录和配置文件
mkdir -p ~/.claude/profiles
在 ~/.claude/profiles/ 下创建一个配置文件,比如 thirdparty.json。内容是一个带 env 外层包裹的 JSON(--settings 加载的是标准 settings 文件,所以需要 env 这一层):
{
"env": {
"ANTHROPIC_BASE_URL": "https://api.example.com",
"ANTHROPIC_API_KEY": "sk-xxxxxxxx"
}
}
把 ANTHROPIC_BASE_URL / ANTHROPIC_API_KEY 换成你要用的端点与密钥即可。想再加一个配置(比如另一家中转或官方某套餐),照着建 another.json 就行。
2. 确认 user 级 settings.json 是干净的
cat ~/.claude/settings.json
如果这里面也有 ANTHROPIC_BASE_URL / ANTHROPIC_API_KEY,建议删掉——否则它和 profile 里的 env 可能重叠,切换时不好判断到底生效的是哪份。
3. 清理旧的 alias(避免和新函数冲突)
如果之前用过类似 alias claude-3p="claude --settings ..." 的写法,打开 ~/.bashrc 把它们删掉或注释掉,不然会和 claude() 函数打架。
4. 把函数写进配置文件末尾
cat >> ~/.bashrc << 'EOF'
claude() {
if [[ "$1" == "-P" ]]; then
if [[ -z "$2" ]]; then
echo "Usage: claude -P <profile>" >&2
return 1
fi
local profile="$2"
local settings="$HOME/.claude/profiles/${profile}.json"
shift 2
if [[ ! -f "$settings" ]]; then
echo "Claude profile not found: $profile" >&2
echo "Expected: $settings" >&2
return 1
fi
command claude --settings "$settings" "$@"
else
command claude "$@"
fi
}
EOF
5. 重新加载配置
source ~/.bashrc
6. 验证三种场景
claude -P thirdparty # 应该走配置文件里的第三方端点
claude -P xxx # 故意打错名字,应该报错 "Claude profile not found" 并显示 Expected 路径
claude # 不带参数,应该正常走默认(官方订阅)
进去之后跑一下 /status,确认反映出的 API 端点符合预期:第一种应显示配置里的第三方域名,第三种应显示官方默认。
进阶:透传所有官方参数
因为函数只消费了 -P 和配置名这两个参数,剩下的 "$@" 会原样交给真正的 claude,所以官方所有 flag 组合都能用。以恢复会话为例(注意是 -r / --resume,不是光写 resume 这个词):
claude -P thirdparty --resume # 打开会话选择器,交互式挑一个历史会话恢复
claude -P thirdparty -r "会话名" "接着刚才的任务继续" # 精确恢复某个会话并带一句新指令
claude -P thirdparty -c # 直接继续最近一次会话
以 claude -P thirdparty -r xxx 为例,函数内部:$1=-P、$2=thirdparty 走 if 分支;shift 2 丢掉这两个后,"$@" 就是 -r xxx;最终执行的是 command claude --settings ~/.claude/profiles/thirdparty.json -r xxx。-P 只负责换配置,和 session 管理参数互不干扰。
小结
- Claude Code 原生没有
-p 配置名,-p是 headless 模式,官方切换配置用--settings; - 一段 shell 函数拦截大写
-P,把claude -P xxx翻译成--settings ~/.claude/profiles/xxx.json,实现和codex -p一样的手感; - 函数带空参数检查 + 文件存在性检查,打错名字会明确报错而不是静默走默认;
- 除
-P外的参数全部透传,「第三方配置 + resume/continue」这类组合照常可用; - 再加新配置只需在
~/.claude/profiles/下新建一个 json,不用改函数。


