Инструмент Shell (run_shell_command)
В этом документе описывается инструмент run_shell_command для Qwen Code.
Описание
Используйте run_shell_command для взаимодействия с базовой системой, запуска скриптов или выполнения операций командной строки. run_shell_command выполняет заданную shell-команду, включая интерактивные команды, требующие ввода данных пользователем (например, vim, git rebase -i), если параметр tools.shell.enableInteractiveShell установлен в значение true.
В Windows команды выполняются с помощью cmd.exe /c. На других платформах они выполняются с помощью bash -c.
Аргументы
run_shell_command принимает следующие аргументы:
command(string, required): Точная shell-команда для выполнения.description(string, optional): Краткое описание назначения команды, которое будет показано пользователю.directory(string, optional): Каталог (относительно корня проекта), в котором нужно выполнить команду. Если не указано, команда выполняется в корне проекта.is_background(boolean, required): Запускать ли команду в фоновом режиме. Этот параметр обязателен для обеспечения явного выбора режима выполнения команды. Установите значениеtrueдля долго работающих процессов, таких как серверы разработки, watchers или демоны, которые должны продолжать работать без блокировки последующих команд. Установите значениеfalseдля разовых команд, выполнение которых должно завершиться перед переходом к следующему шагу.
Как использовать run_shell_command в Qwen Code
При использовании run_shell_command команда выполняется как подпроцесс. Вы можете управлять тем, будут ли команды выполняться в фоновом или активном режиме, с помощью параметра is_background или явного добавления & к командам. Инструмент возвращает подробную информацию о выполнении, включая:
Обязательный параметр фонового режима
Параметр is_background является обязательным для выполнения всех команд. Такое решение гарантирует, что LLM (и пользователи) должны явно определять, будет ли каждая команда выполняться в фоновом или активном режиме, что обеспечивает осознанное и предсказуемое поведение при выполнении команд. Делая этот параметр обязательным, мы избегаем непреднамеренного переключения на выполнение в активном режиме, что могло бы заблокировать последующие операции при работе с долго выполняющимися процессами.
Фоновое и активное выполнение
Инструмент корректно обрабатывает фоновое и активное выполнение на основе вашего явного выбора:
Используйте фоновое выполнение (is_background: true) для:
- Долго работающих серверов разработки:
npm run start,npm run dev,yarn dev - Watchers для сборок:
npm run watch,webpack --watch - Серверов баз данных:
mongod,mysql,redis-server - Веб-серверов:
python -m http.server,php -S localhost:8000 - Любых команд, которые должны выполняться бесконечно до ручной остановки
Используйте активное выполнение (is_background: false) для:
- Разовых команд:
ls,cat,grep - Команд сборки:
npm run build,make - Команд установки:
npm install,pip install - Git-операций:
git commit,git push - Запуска тестов:
npm test,pytest
Информация о выполнении
Инструмент возвращает подробную информацию о выполнении, включая:
Command: Выполненная команда.Directory: Каталог, в котором была выполнена команда.Stdout: Вывод из стандартного потока вывода.Stderr: Вывод из стандартного потока ошибок.Error: Любое сообщение об ошибке, полученное от подпроцесса.Exit Code: Код завершения команды.Signal: Номер сигнала, если команда была завершена по сигналу.Background PIDs: Список PID для любых запущенных фоновых процессов.
Использование:
run_shell_command(command="Your commands.", description="Your description of the command.", directory="Your execution directory.", is_background=false)Примечание: Параметр is_background является обязательным и должен быть явно указан для каждого выполнения команды.
Примеры run_shell_command
Вывод списка файлов в текущем каталоге:
run_shell_command(command="ls -la", is_background=false)Запуск скрипта в определенном каталоге:
run_shell_command(command="./my_script.sh", directory="scripts", description="Run my custom script", is_background=false)Запуск фонового сервера разработки (рекомендуемый подход):
run_shell_command(command="npm run dev", description="Start development server in background", is_background=true)Запуск фонового сервера (альтернатива с явным указанием &):
run_shell_command(command="npm run dev &", description="Start development server in background", is_background=false)Запуск команды сборки в активном режиме:
run_shell_command(command="npm run build", description="Build the project", is_background=false)Запуск нескольких фоновых сервисов:
run_shell_command(command="docker-compose up", description="Start all services", is_background=true)Конфигурация
Вы можете настроить поведение инструмента run_shell_command, изменив файл settings.json или используя команду /settings в Qwen Code.
Включение интерактивных команд
Параметр tools.shell.enableInteractiveShell определяет, будут ли shell-команды выполняться через node-pty (интерактивный PTY) или через стандартный бэкенд child_process. Если параметр включен, интерактивные сеансы, такие как vim, git rebase -i и TUI-программы, работают корректно.
По умолчанию этот параметр имеет значение true на большинстве платформ. В сборках Windows <= 19041 (до Windows 10 версии 2004) по умолчанию установлено значение false, поскольку старые реализации ConPTY имеют известные проблемы с надежностью (отсутствие вывода, зависания). Это соответствует той же границе, используемой в VS Code (microsoft/vscode#123725 ). Если node-pty недоступен во время выполнения, инструмент переключается на child_process независимо от этого параметра.
Чтобы явно переопределить значение по умолчанию, задайте его в settings.json:
Пример settings.json:
{
"tools": {
"shell": {
"enableInteractiveShell": true
}
}
}Отображение цвета в выводе
Чтобы включить цвет в выводе shell, необходимо установить для параметра tools.shell.showColor значение true. Примечание: Этот параметр применяется только тогда, когда включен tools.shell.enableInteractiveShell.
Пример settings.json:
{
"tools": {
"shell": {
"showColor": true
}
}
}Настройка пейджера
Вы можете задать пользовательский пейджер для вывода shell, установив параметр tools.shell.pager. Пейджер по умолчанию — cat на платформах, отличных от Windows. В Windows пейджер по умолчанию не задан. Установите для tools.shell.pager пустую строку, чтобы отключить переменные окружения пейджера. Примечание: Этот параметр применяется только тогда, когда включен tools.shell.enableInteractiveShell.
Пример settings.json:
{
"tools": {
"shell": {
"pager": "less"
}
}
}Интерактивные команды
Инструмент run_shell_command теперь поддерживает интерактивные команды благодаря интеграции псевдотерминала (pty). Это позволяет запускать команды, требующие ввода данных пользователем в реальном времени, такие как текстовые редакторы (vim, nano), терминальные пользовательские интерфейсы (htop) и интерактивные операции системы контроля версий (git rebase -i).
Когда интерактивная команда выполняется, вы можете отправлять в нее ввод из Qwen Code. Чтобы переключить фокус на интерактивный shell, нажмите ctrl+f. Вывод терминала, включая сложные TUI, будет отображаться корректно.
Важные замечания
- Безопасность: Будьте осторожны при выполнении команд, особенно тех, которые формируются на основе пользовательского ввода, чтобы предотвратить уязвимости в системе безопасности.
- Обработка ошибок: Проверяйте поля
Stderr,ErrorиExit Code, чтобы определить, успешно ли выполнена команда. - Фоновые процессы: Когда
is_background=trueили команда содержит&, инструмент немедленно вернет управление, а процесс продолжит выполняться в фоновом режиме. ПолеBackground PIDsбудет содержать идентификатор фонового процесса. - Выбор фонового выполнения: Параметр
is_backgroundявляется обязательным и обеспечивает явный контроль над режимом выполнения. Вы также можете добавить&к команде для ручного фонового выполнения, но параметрis_backgroundвсе равно должен быть указан. Этот параметр задает более понятное намерение и автоматически настраивает фоновое выполнение. - Описания команд: При использовании
is_background=trueописание команды будет включать индикатор[background]для явного указания режима выполнения.
Переменные окружения
Когда run_shell_command выполняет команду, он устанавливает переменную окружения QWEN_CODE=1 в окружении подпроцесса. Это позволяет скриптам или инструментам определять, запущены ли они из CLI.
Ограничения команд
Вы можете ограничить команды, которые могут выполняться инструментом run_shell_command, используя параметры tools.core и tools.exclude в вашем конфигурационном файле.
tools.core: Чтобы ограничитьrun_shell_commandопределенным набором команд, добавьте записи в списокcoreв категорииtoolsв форматеrun_shell_command(<command>). Например,"tools": {"core": ["run_shell_command(git)"]}разрешит только командыgit. Использование общегоrun_shell_commandдействует как шаблон (wildcard), разрешая любую команду, которая не заблокирована явно.tools.exclude: Чтобы заблокировать определенные команды, добавьте записи в списокexcludeв категорииtoolsв форматеrun_shell_command(<command>). Например,"tools": {"exclude": ["run_shell_command(rm)"]}заблокирует командыrm.
Логика валидации разработана с учетом безопасности и гибкости:
- Объединение команд отключено: Инструмент автоматически разделяет команды, объединенные с помощью
&&,||или;, и проверяет каждую часть отдельно. Если какая-либо часть цепочки запрещена, блокируется вся команда. - Сопоставление по префиксу: Инструмент использует сопоставление по префиксу. Например, если вы разрешите
git, вы сможете запускатьgit statusилиgit log. - Приоритет списка блокировок: Список
tools.excludeвсегда проверяется первым. Если команда соответствует заблокированному префиксу, она будет отклонена, даже если она также соответствует разрешенному префиксу вtools.core.
Примеры ограничения команд
Разрешение только определенных префиксов команд
Чтобы разрешить только команды git и npm, а все остальные заблокировать:
{
"tools": {
"core": ["run_shell_command(git)", "run_shell_command(npm)"]
}
}git status: Разрешеноnpm install: Разрешеноls -l: Заблокировано
Блокировка определенных префиксов команд
Чтобы заблокировать rm и разрешить все остальные команды:
{
"tools": {
"core": ["run_shell_command"],
"exclude": ["run_shell_command(rm)"]
}
}rm -rf /: Заблокированоgit status: Разрешеноnpm install: Разрешено
Список блокировок имеет приоритет
Если префикс команды присутствует и в tools.core, и в tools.exclude, он будет заблокирован.
{
"tools": {
"core": ["run_shell_command(git)"],
"exclude": ["run_shell_command(git push)"]
}
}git push origin main: Заблокированоgit status: Разрешено
Блокировка всех shell-команд
Чтобы заблокировать все shell-команды, добавьте шаблон run_shell_command в tools.exclude:
{
"tools": {
"exclude": ["run_shell_command"]
}
}ls -l: Заблокированолюбая другая команда: Заблокировано
Примечание по безопасности для excludeTools
Специфичные для команд ограничения в excludeTools для run_shell_command основаны на простом сопоставлении строк и могут быть легко обойдены. Эта функция не является механизмом безопасности, и на нее не следует полагаться при безопасном выполнении ненадежного кода. Рекомендуется использовать coreTools для явного выбора команд, которые могут быть выполнены.