Инструмент Shell (run_shell_command
)
Этот документ описывает инструмент run_shell_command
для Qwen Code.
Описание
Используйте run_shell_command
для взаимодействия с базовой системой, запуска скриптов или выполнения операций в командной строке. run_shell_command
выполняет указанную shell-команду. В Windows команда будет выполнена с помощью cmd.exe /c
. На других платформах команда будет выполнена с помощью bash -c
.
Аргументы
run_shell_command
принимает следующие аргументы:
command
(string, обязательный): Точная shell-команда для выполнения.description
(string, опциональный): Краткое описание назначения команды, которое будет показано пользователю.directory
(string, опциональный): Директория (относительно корня проекта), в которой нужно выполнить команду. Если не указана, команда выполняется в корне проекта.is_background
(boolean, обязательный): Определяет, следует ли запускать команду в фоновом режиме. Этот параметр обязателен, чтобы явно указать режим выполнения команды. Установитеtrue
для долгоживущих процессов, таких как серверы разработки, наблюдатели или демоны, которые должны продолжать работу, не блокируя выполнение других команд. Установитеfalse
для одноразовых команд, которые должны завершиться до продолжения работы.
Как использовать run_shell_command
с Qwen Code
При использовании run_shell_command
команда выполняется как подпроцесс. Вы можете контролировать, будут ли команды выполняться в фоновом или активном режиме, используя параметр is_background
, либо явно добавляя &
к командам. Инструмент возвращает подробную информацию о выполнении, включая:
Обязательный параметр Background
Параметр is_background
является обязательным для всех выполнений команд. Такое решение гарантирует, что LLM (и пользователи) должны явно решать, должна ли каждая команда выполняться в фоновом или активном режиме, способствуя целенаправленному и предсказуемому поведению выполнения команд. Обязательность этого параметра позволяет избежать непреднамеренного возврата к активному выполнению, которое может блокировать последующие операции при работе с длительными процессами.
Фоновое и активное выполнение
Инструмент интеллектуально управляет фоновым и активным выполнением в зависимости от вашего явного выбора:
Используйте фоновое выполнение (is_background: true
) для:
- Долго работающих серверов разработки:
npm run start
,npm run dev
,yarn dev
- Наблюдателей за сборкой:
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
: Любое сообщение об ошибке, сообщенное subprocess.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)
Важные замечания
- Безопасность: Будьте осторожны при выполнении команд, особенно тех, что собраны из пользовательского ввода, чтобы избежать уязвимостей безопасности.
- Интерактивные команды: Избегайте команд, требующих интерактивного ввода от пользователя, так как это может привести к зависанию инструмента. Используйте флаги для неинтерактивного режима, если они доступны (например,
npm init -y
). - Обработка ошибок: Проверяйте поля
Stderr
,Error
иExit Code
, чтобы определить, успешно ли выполнилась команда. - Фоновые процессы: Когда
is_background=true
или когда команда содержит&
, инструмент немедленно вернёт управление, а процесс продолжит выполняться в фоне. ПолеBackground PIDs
будет содержать ID фонового процесса. - Выбор фонового выполнения: Параметр
is_background
обязателен и обеспечивает явный контроль над режимом выполнения. Вы также можете добавить&
к команде для ручного запуска в фоне, но параметрis_background
всё равно должен быть указан. Этот параметр делает намерение более понятным и автоматически управляет настройкой фонового выполнения. - Описание команд: При использовании
is_background=true
в описании команды будет указано[background]
, чтобы явно показать режим выполнения.
Переменные окружения
Когда run_shell_command
выполняет команду, она устанавливает переменную окружения QWEN_CODE=1
в среде дочернего процесса. Это позволяет скриптам или инструментам определить, запущены ли они из CLI.
Ограничения команд
Вы можете ограничить команды, которые могут быть выполнены с помощью инструмента run_shell_command
, используя настройки coreTools
и excludeTools
в вашем конфигурационном файле.
coreTools
: Чтобы ограничитьrun_shell_command
определённым набором команд, добавьте записи в списокcoreTools
в форматеrun_shell_command(<command>)
. Например,"coreTools": ["run_shell_command(git)"]
разрешит только командыgit
. Если указать общийrun_shell_command
, это будет работать как wildcard, разрешая любые команды, которые явно не заблокированы.excludeTools
: Чтобы заблокировать определённые команды, добавьте записи в списокexcludeTools
в форматеrun_shell_command(<command>)
. Например,"excludeTools": ["run_shell_command(rm)"]
заблокирует командыrm
.
Логика валидации разработана так, чтобы быть безопасной и гибкой:
- Цепочки команд отключены: Инструмент автоматически разделяет команды, объединённые с помощью
&&
,||
или;
, и проверяет каждую часть отдельно. Если какая-либо часть цепочки запрещена, вся команда блокируется. - Сопоставление по префиксу: Инструмент использует сопоставление по префиксу. Например, если вы разрешаете
git
, вы можете выполнятьgit status
илиgit log
. - Приоритет чёрного списка: Список
excludeTools
всегда проверяется первым. Если команда совпадает с заблокированным префиксом, она будет отклонена, даже если также совпадает с разрешённым префиксом изcoreTools
.
Примеры ограничений команд
Разрешить только определённые префиксы команд
Чтобы разрешить только команды git
и npm
, а все остальные блокировать:
{
"coreTools": ["run_shell_command(git)", "run_shell_command(npm)"]
}
git status
: Разрешеноnpm install
: Разрешеноls -l
: Заблокировано
Блокировать определённые префиксы команд
Чтобы заблокировать rm
и разрешить все остальные команды:
{
"coreTools": ["run_shell_command"],
"excludeTools": ["run_shell_command(rm)"]
}
rm -rf /
: Заблокированоgit status
: Разрешеноnpm install
: Разрешено
Блокировка имеет приоритет
Если префикс команды указан и в coreTools
, и в excludeTools
, то он будет заблокирован.
{
"coreTools": ["run_shell_command(git)"],
"excludeTools": ["run_shell_command(git push)"]
}
git push origin main
: Заблокированоgit status
: Разрешено
Блокировать все shell-команды
Чтобы заблокировать все shell-команды, добавьте wildcard run_shell_command
в excludeTools
:
{
"excludeTools": ["run_shell_command"]
}
ls -l
: Заблокированолюбая другая команда
: Заблокировано
Заметка о безопасности для excludeTools
Ограничения на уровне команд в excludeTools
для run_shell_command
основаны на простом сравнении строк и могут быть легко обойдены. Эта функция не является механизмом безопасности и не должна использоваться для безопасного выполнения недоверенного кода. Рекомендуется использовать coreTools
для явного выбора команд, которые можно выполнять.