Outil Shell (run_shell_command)
Ce document décrit l’outil run_shell_command pour Qwen Code.
Description
Utilisez run_shell_command pour interagir avec le système sous-jacent, exécuter des scripts ou effectuer des opérations en ligne de commande. run_shell_command exécute une commande shell donnée, y compris les commandes interactives nécessitant une saisie utilisateur (par exemple, vim, git rebase -i) si le paramètre tools.shell.enableInteractiveShell est défini sur true.
Sur Windows, les commandes sont exécutées avec cmd.exe /c. Sur les autres plateformes, elles sont exécutées avec bash -c.
Arguments
run_shell_command prend les arguments suivants :
command(string, requis) : La commande shell exacte à exécuter.description(string, optionnel) : Une brève description de l’objectif de la commande, qui sera affichée à l’utilisateur.directory(string, optionnel) : Le répertoire (relatif à la racine du projet) dans lequel exécuter la commande. Si non fourni, la commande s’exécute à la racine du projet.is_background(boolean, requis) : Indique si la commande doit s’exécuter en arrière-plan. Ce paramètre est requis pour garantir une décision explicite concernant le mode d’exécution de la commande. Définissez-le surtruepour les processus de longue durée comme les serveurs de développement, les watchers ou les démons qui doivent continuer à s’exécuter sans bloquer les commandes suivantes. Définissez-le surfalsepour les commandes ponctuelles qui doivent se terminer avant de continuer.
Comment utiliser run_shell_command avec Qwen Code
Lors de l’utilisation de run_shell_command, la commande est exécutée en tant que sous-processus. Vous pouvez contrôler si les commandes s’exécutent en arrière-plan ou au premier plan en utilisant le paramètre is_background, ou en ajoutant explicitement & aux commandes. L’outil renvoie des informations détaillées sur l’exécution, notamment :
Paramètre d’arrière-plan requis
Le paramètre is_background est requis pour toutes les exécutions de commandes. Cette conception garantit que le LLM (et les utilisateurs) doit décider explicitement si chaque commande doit s’exécuter en arrière-plan ou au premier plan, favorisant ainsi un comportement d’exécution intentionnel et prévisible. En rendant ce paramètre obligatoire, nous évitons un repli involontaire vers l’exécution au premier plan, ce qui pourrait bloquer les opérations suivantes lors du traitement de processus de longue durée.
Exécution en arrière-plan et au premier plan
L’outil gère intelligemment l’exécution en arrière-plan et au premier plan en fonction de votre choix explicite :
Utilisez l’exécution en arrière-plan (is_background: true) pour :
- Les serveurs de développement de longue durée :
npm run start,npm run dev,yarn dev - Les watchers de build :
npm run watch,webpack --watch - Les serveurs de base de données :
mongod,mysql,redis-server - Les serveurs web :
python -m http.server,php -S localhost:8000 - Toute commande censée s’exécuter indéfiniment jusqu’à ce qu’elle soit arrêtée manuellement
Utilisez l’exécution au premier plan (is_background: false) pour :
- Les commandes ponctuelles :
ls,cat,grep - Les commandes de build :
npm run build,make - Les commandes d’installation :
npm install,pip install - Les opérations Git :
git commit,git push - Les exécutions de tests :
npm test,pytest
Informations d’exécution
L’outil renvoie des informations détaillées sur l’exécution, notamment :
Command: La commande qui a été exécutée.Directory: Le répertoire dans lequel la commande a été exécutée.Stdout: La sortie du flux de sortie standard.Stderr: La sortie du flux d’erreur standard.Error: Tout message d’erreur signalé par le sous-processus.Exit Code: Le code de retour de la commande.Signal: Le numéro du signal si la commande a été terminée par un signal.Background PIDs: Une liste des PID pour tout processus en arrière-plan démarré.
Utilisation :
run_shell_command(command="Your commands.", description="Your description of the command.", directory="Your execution directory.", is_background=false)Remarque : Le paramètre is_background est requis et doit être explicitement spécifié pour chaque exécution de commande.
Exemples de run_shell_command
Lister les fichiers dans le répertoire courant :
run_shell_command(command="ls -la", is_background=false)Exécuter un script dans un répertoire spécifique :
run_shell_command(command="./my_script.sh", directory="scripts", description="Run my custom script", is_background=false)Démarrer un serveur de développement en arrière-plan (approche recommandée) :
run_shell_command(command="npm run dev", description="Start development server in background", is_background=true)Démarrer un serveur en arrière-plan (alternative avec & explicite) :
run_shell_command(command="npm run dev &", description="Start development server in background", is_background=false)Exécuter une commande de build au premier plan :
run_shell_command(command="npm run build", description="Build the project", is_background=false)Démarrer plusieurs services en arrière-plan :
run_shell_command(command="docker-compose up", description="Start all services", is_background=true)Configuration
Vous pouvez configurer le comportement de l’outil run_shell_command en modifiant votre fichier settings.json ou en utilisant la commande /settings dans Qwen Code.
Activation des commandes interactives
Le paramètre tools.shell.enableInteractiveShell contrôle si les commandes shell sont exécutées via node-pty (PTY interactif) ou le backend standard child_process. Lorsqu’il est activé, les sessions interactives telles que vim, git rebase -i et les programmes TUI fonctionnent correctement.
Ce paramètre est par défaut sur true sur la plupart des plateformes. Sur les builds Windows <= 19041 (avant Windows 10 version 2004), il est par défaut sur false car les anciennes implémentations de ConPTY présentent des problèmes de fiabilité connus (sorties manquantes, blocages). Cela correspond au même seuil utilisé par VS Code (microsoft/vscode#123725 ). Si node-pty n’est pas disponible au moment de l’exécution, l’outil revient à child_process indépendamment de ce paramètre.
Pour remplacer explicitement la valeur par défaut, définissez la valeur dans settings.json :
Exemple de settings.json :
{
"tools": {
"shell": {
"enableInteractiveShell": true
}
}
}Affichage des couleurs dans la sortie
Pour afficher les couleurs dans la sortie du shell, vous devez définir le paramètre tools.shell.showColor sur true. Remarque : Ce paramètre s’applique uniquement lorsque tools.shell.enableInteractiveShell est activé.
Exemple de settings.json :
{
"tools": {
"shell": {
"showColor": true
}
}
}Configuration du pager
Vous pouvez définir un pager personnalisé pour la sortie du shell en configurant le paramètre tools.shell.pager. Le pager par défaut est cat sur les plateformes non-Windows. Aucun pager par défaut n’est défini sur Windows. Définissez tools.shell.pager sur une chaîne vide pour désactiver les variables d’environnement du pager. Remarque : Ce paramètre s’applique uniquement lorsque tools.shell.enableInteractiveShell est activé.
Exemple de settings.json :
{
"tools": {
"shell": {
"pager": "less"
}
}
}Commandes interactives
L’outil run_shell_command prend désormais en charge les commandes interactives en intégrant un pseudo-terminal (pty). Cela vous permet d’exécuter des commandes nécessitant une saisie utilisateur en temps réel, telles que les éditeurs de texte (vim, nano), les interfaces utilisateur en mode terminal (htop) et les opérations de contrôle de version interactives (git rebase -i).
Lorsqu’une commande interactive est en cours d’exécution, vous pouvez lui envoyer des saisies depuis Qwen Code. Pour donner le focus au shell interactif, appuyez sur ctrl+f. La sortie du terminal, y compris les TUI complexes, sera rendue correctement.
Notes importantes
- Sécurité : Soyez prudent lors de l’exécution de commandes, en particulier celles construites à partir de saisies utilisateur, afin de prévenir les vulnérabilités de sécurité.
- Gestion des erreurs : Vérifiez les champs
Stderr,ErroretExit Codepour déterminer si une commande s’est exécutée avec succès. - Processus en arrière-plan : Lorsque
is_background=trueou qu’une commande contient&, l’outil retournera immédiatement et le processus continuera de s’exécuter en arrière-plan. Le champBackground PIDscontiendra l’identifiant de processus du processus en arrière-plan. - Choix d’exécution en arrière-plan : Le paramètre
is_backgroundest requis et fournit un contrôle explicite sur le mode d’exécution. Vous pouvez également ajouter&à la commande pour une exécution manuelle en arrière-plan, mais le paramètreis_backgrounddoit toujours être spécifié. Ce paramètre fournit une intention plus claire et gère automatiquement la configuration de l’exécution en arrière-plan. - Descriptions des commandes : Lors de l’utilisation de
is_background=true, la description de la commande inclura un indicateur[background]pour indiquer clairement le mode d’exécution.
Variables d’environnement
Lorsque run_shell_command exécute une commande, il définit la variable d’environnement QWEN_CODE=1 dans l’environnement du sous-processus. Cela permet aux scripts ou aux outils de détecter s’ils sont exécutés depuis la CLI.
Restrictions de commandes
Vous pouvez restreindre les commandes pouvant être exécutées par l’outil run_shell_command en utilisant les paramètres tools.core et tools.exclude dans votre fichier de configuration.
tools.core: Pour restreindrerun_shell_commandà un ensemble spécifique de commandes, ajoutez des entrées à la listecoresous la catégorietoolsau formatrun_shell_command(<command>). Par exemple,"tools": {"core": ["run_shell_command(git)"]}n’autorisera que les commandesgit. L’inclusion durun_shell_commandgénérique agit comme un caractère générique, autorisant toute commande non explicitement bloquée.tools.exclude: Pour bloquer des commandes spécifiques, ajoutez des entrées à la listeexcludesous la catégorietoolsau formatrun_shell_command(<command>). Par exemple,"tools": {"exclude": ["run_shell_command(rm)"]}bloquera les commandesrm.
La logique de validation est conçue pour être sécurisée et flexible :
- Chaînage de commandes désactivé : L’outil divise automatiquement les commandes chaînées avec
&&,||ou;et valide chaque partie séparément. Si une partie de la chaîne n’est pas autorisée, la commande entière est bloquée. - Correspondance de préfixe : L’outil utilise la correspondance de préfixe. Par exemple, si vous autorisez
git, vous pouvez exécutergit statusougit log. - Priorité de la liste de blocage : La liste
tools.excludeest toujours vérifiée en premier. Si une commande correspond à un préfixe bloqué, elle sera refusée, même si elle correspond également à un préfixe autorisé danstools.core.
Exemples de restriction de commandes
Autoriser uniquement des préfixes de commandes spécifiques
Pour autoriser uniquement les commandes git et npm, et bloquer toutes les autres :
{
"tools": {
"core": ["run_shell_command(git)", "run_shell_command(npm)"]
}
}git status: Autorisénpm install: Autoriséls -l: Bloqué
Bloquer des préfixes de commandes spécifiques
Pour bloquer rm et autoriser toutes les autres commandes :
{
"tools": {
"core": ["run_shell_command"],
"exclude": ["run_shell_command(rm)"]
}
}rm -rf /: Bloquégit status: Autorisénpm install: Autorisé
La liste de blocage est prioritaire
Si un préfixe de commande se trouve à la fois dans tools.core et tools.exclude, il sera bloqué.
{
"tools": {
"core": ["run_shell_command(git)"],
"exclude": ["run_shell_command(git push)"]
}
}git push origin main: Bloquégit status: Autorisé
Bloquer toutes les commandes shell
Pour bloquer toutes les commandes shell, ajoutez le caractère générique run_shell_command à tools.exclude :
{
"tools": {
"exclude": ["run_shell_command"]
}
}ls -l: Bloquétoute autre commande: Bloqué
Note de sécurité pour excludeTools
Les restrictions spécifiques aux commandes dans excludeTools pour run_shell_command sont basées sur une simple correspondance de chaînes et peuvent être facilement contournées. Cette fonctionnalité n’est pas un mécanisme de sécurité et ne doit pas être utilisée pour exécuter du code non fiable en toute sécurité. Il est recommandé d’utiliser coreTools pour sélectionner explicitement les commandes pouvant être exécutées.