Claude Code 用 shell 函数实现 claude -P 配置一键切换(类似 codex -p)

实用教程 admin 1小时前 5次浏览 0个评论

介绍

用 Codex 的人习惯 codex -p 配置名 一键切换不同配置(官方订阅 / 第三方 API 等)。Claude Code 没有原生的「-p 配置名」这种写法——而且它的 -p 参数已经被占用了,意思是 headless(print,非交互式输出)模式,和 Codex 里 -p 表示 profile 完全是两码事。官方切换配置的方式是 --settings <文件路径>,没有更短的原生写法。

这篇教程教你用一段 shell 函数包一层,实现 claude -P 配置名 的一键切换手感:-P(大写)负责选配置,后面跟的所有参数原样透传给真正的 claude,和官方所有 flag 完全兼容。配好后 claude -P xxxclaude -P xxx --resume 都能直接用。

Claude Code 用 claude -P 一键切换配置

思路:把 –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 settingsshift 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,不用改函数。

喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址