Переменные окружения в Claude Code задают провайдера, аутентификацию, соответствие моделей, таймауты, телеметрию, feature-переключатели и поведение subprocess. Полный официальный индекс вынесен в справочник в конце книги; здесь важнее правила эксплуатации - где какую переменную задавать и чем это грозит. Переменная окружения - мощный, но тупой инструмент: она действует глобально на процесс, поэтому место её задания важно не меньше, чем значение.
Место зависит от природы переменной. Аутентификацию для пользователя или машины держат в shell-профиле или secret-менеджере; credentials и конфигурацию провайдера для автоматизации - в CI-секретах; несекретные project- и user-defaults - в поле env файла settings.json; одноразовый воспроизводимый прогон настраивают флагом --settings. Полезно один раз свести это в таблицу, чтобы не положить секрет туда, откуда он утечёт в репозиторий или логи.
| Место | Когда использовать |
|---|---|
| shell/profile или secret-менеджер | Аутентификация пользователя/машины |
| CI secret/variable | Credentials автоматизации и конфиг провайдера |
| settings.json -> env | Несекретные project/user defaults |
| --settings | Одноразовый воспроизводимый прогон |
С провайдерами связана отдельная осторожность. Если вы используете ANTHROPIC_BASE_URL, Bedrock, Vertex, Foundry или gateway, документируйте весь набор provider-переменных и обязательно проверяйте /status: смешанная конфигурация может незаметно отправить запрос не ожидаемому провайдеру - с другим биллингом и другой политикой. Секретные значения при этом не помещают в закоммиченный settings.json; для них есть secret-store и инъекция из окружения.
Status line - это настраиваемая строка состояния, которую рисует ваш скрипт. Команда /statusline помогает его настроить: скрипт получает на stdin JSON с состоянием сессии и возвращает одну строку. Требования простые и важные: он должен быть быстрым, устойчивым к отсутствующим полям и не печатать секреты. Полезно один раз увидеть каркас такого скрипта - и запомнить, что тяжёлый git status на каждый redraw в status line запускать нельзя, иначе интерфейс начнёт тормозить.
Keybindings позволяют переназначить интерактивные действия, но требуют осторожности. Команда /keybindings открывает конфигурацию, а пользовательский файл живёт в ~/.claude/keybindings.json. Главная тонкость - перехват терминалом: сочетания с Ctrl и Alt могут быть перехвачены shell, IDE или ОС раньше, чем до них доберётся Claude Code. Поэтому начинают с одного переназначения, проверяют конфликты и сохраняют путь возврата к defaults, а не переписывают всё сразу.
Output styles меняют инструкции о форме ответа, а не возможности модели. Встроенные стили и кастомные Markdown-определения выбирают через /config или ключом outputStyle - отдельная команда /output-style удалена в версии 2.1.91; смена стиля требует /clear или перезапуска, потому что стиль входит в system prompt. Стиль уместен для устойчивой формы - concise, explanatory, доменной, - но в него нельзя прятать security policy: её труднее инспектировать, а permission и sandbox всё равно должны оставаться детерминированными, а не зависеть от стиля вывода.
Важно помнить, что окружение - часть поверхности атаки. Унаследованные переменные доступны процессу, а иногда и его subprocess; в незнакомом checkout чужая конфигурация может увидеть больше, чем вы предполагали. Перед запуском в непроверенном репозитории используют минимальное окружение, а для корпоративной изоляции - sandbox-правила по credentials. Забытая переменная - это доступ, который вы не заметили, что выдали.
Типичные провалы работы с окружением и интерфейсом предсказуемы. Секрет в закоммиченном settings.json вместо secret-store. Смешанная provider-конфигурация, отправляющая запрос не туда, без проверки /status. Тяжёлый git status в status line, тормозящий каждый redraw. Переназначенная клавиша, которую перехватывает терминал. И security policy, спрятанная в output style вместо детерминированных permissions. Задавайте переменные в правильном месте, проверяйте провайдера через /status и держите безопасность в permissions и sandbox.
#!/usr/bin/env node
// status line: JSON состояния на stdin -> одна строка; быстро, без секретов
let input = '';
process.stdin.setEncoding('utf8');
process.stdin.on('data', chunk => (input += chunk));
process.stdin.on('end', () => {
const state = JSON.parse(input || '{}');
const model = state.model?.display_name || state.model?.id || 'model?';
const dir = state.workspace?.current_dir || process.cwd();
process.stdout.write(`${model} · ${dir.split(/[\\/]/).pop()}`);
});