Accueil / Fondamentaux et boucle d'agent
Exécuter des commandes shell
L'outil Bash exécute une vraie commande shell sur votre poste, pas une simulation, puis Claude Code lit la sortie standard et la sortie d'erreur pour poursuivre à partir de ce qui a réellement été produit. Une invite de permission s'affiche avant chaque commande nouvelle, sauf pour un jeu intégré de commandes en lecture seule.
L'outil Bash exécute une vraie commande shell sur votre poste, pas une simulation. Claude Code lit ensuite la sortie standard et la sortie d'erreur de cette commande pour poursuivre son raisonnement à partir de ce qu'elle a réellement produit, et non de ce qui était attendu.
Une invite avant chaque commande nouvelle
Avant qu'une commande shell nouvelle ne s'exécute, une invite de permission s'affiche à l'écran. La documentation officielle décrit ce comportement pour les commandes shell comme une confirmation demandée à chaque fois, sauf pour un jeu intégré de commandes en lecture seule qui s'exécutent directement. Répondre avec l'option qui mémorise le choix rend cette commande précise approuvée de façon permanente, mais seulement pour le dépôt en cours et pour cette commande précise : ce n'est pas une autorisation générale qui s'étendrait à toute commande shell future.
Le motif global qui réactive l'invite
Une commande déjà approuvée peut malgré tout redéclencher l'invite. Quand un motif global non protégé figure dans les arguments d'une commande à drapeaux capables d'écrire ou d'exécuter, par exemple find, sort, sed ou git, l'invite réapparaît même si la commande de base figure déjà sur la liste des commandes de confiance. Ce motif pourrait se développer, au moment de l'exécution, en un drapeau destructeur que personne n'avait approuvé. Ce garde-fou n'est pas un défaut, c'est une protection posée au-dessus de la liste de confiance elle-même.
Cet exemple autonome fabrique son propre fichier avant de le lire, plutôt que d'inspecter un fichier réel du projet :
mkdir -p /tmp/demo-bash
echo "erreur : connexion refusée" > /tmp/demo-bash/journal.txt
grep "erreur" /tmp/demo-bash/journal.txt
La dernière ligne rend le contenu trouvé, erreur : connexion refusée. C'est exactement ce que Claude reçoit en retour d'un appel à l'outil Bash, la sortie brute de la commande, rien de reconstitué et rien de supposé.
Cette lecture de la sortie réelle avant de poursuivre est ce qui fait tourner la boucle d'agent : réfléchir, appeler un outil, observer ce qu'il rend vraiment, recommencer. Le même principe d'approbation au cas par cas se retrouve dans la lecture d'un diff de modification de fichier, où seul le type d'action change.
Les guillemets sautent d'un shell à l'autre
Un script passé en argument à un autre programme arrive parfois déformé, sans message d'erreur clair. Dans l'exemple suivant, les accents graves dans une chaîne entre guillemets doubles sont exécutés par le shell avant que Node ne voie le texte :
node -e "console.log('dossier `echo REMPLACE` fini')"
dossier REMPLACE fini
Le texte écrit était « echo REMPLACE » entre accents graves, et Node a reçu le résultat de la commande. La parade tient en deux lignes : écrivez le script dans un fichier avec un délimiteur entre apostrophes, puis passez son chemin.
cat > note.js << 'EOF'
console.log('dossier `echo REMPLACE` fini')
EOF
node note.js
dossier `echo REMPLACE` fini
Le même risque existe entre PowerShell, cmd, ssh et Git Bash, qui se disputent chacun les guillemets. Dès qu'une commande contient des guillemets imbriqués, mettez-la dans un fichier, ou vérifiez l'écho de ce qui part avant de lancer.
De la commande proposée à la poursuite du raisonnement
L'invite réapparaît même sur une commande déjà approuvée
| Deux commandes envoyées à l'outil Bash sur un dépôt où npm test est déjà approuvé | Invite affichée la première fois | Invite affichée les fois suivantes |
|---|---|---|
| npm test, commande simple déjà approuvée | Oui | Non, elle s'exécute directement |
| find avec un motif global non protégé dans ses arguments | Oui | Oui, l'invite réapparaît à chaque fois |
Un développeur demande à Claude Code de compter les lignes d'un fichier de configuration. Claude propose la commande wc -l config.yaml. Une invite de permission s'affiche à l'écran, avec l'option qui mémorise l'approbation pour ce dépôt et cette commande.
Écrivez en une phrase ce que cette situation établit, et en une phrase ce qu'elle n'établit pas.
Ce que cela établit : La situation établit que si le développeur choisit l'option qui mémorise l'approbation, la commande wc -l config.yaml sur ce dépôt précis s'exécutera ensuite sans nouvelle invite.
Ce que cela n’établit pas : Elle n'établit pas qu'une autre commande, même wc -l sur un fichier différent ou portant un motif global dans ses arguments, s'exécutera elle aussi sans invite.
Les trois calibrages faux les plus courants
- Trop large Elle établit que toutes les commandes shell proposées par Claude sur ce dépôt s'exécuteront désormais sans jamais redemander de confirmation.
- Trop étroit Elle établit seulement qu'une invite de permission existe quelque part dans Claude Code, sans rien dire du dépôt ni de la commande concernés.
- À côté Elle montre que le fichier config.yaml contient plus de lignes que la moyenne des fichiers de configuration du projet.
- L'outil Bash exécute une commande shell réelle sur le poste, et Claude lit sa sortie standard et sa sortie d'erreur pour poursuivre son raisonnement.
- Une invite de permission s'affiche avant chaque commande nouvelle, sauf pour un jeu intégré de commandes en lecture seule qui s'exécutent directement.
- Approuver une commande avec l'option qui mémorise le choix la rend permanente, mais seulement pour ce dépôt et cette commande précise.
- Un motif global non protégé présent dans les arguments d'une commande à drapeaux capables d'écrire, comme find, sort, sed ou git, redéclenche toujours une invite même sur une commande déjà en liste de confiance.
- Un script passé en argument entre shells arrive déformé sans erreur claire : écrire le script dans un fichier et passer son chemin évite le problème.
Dans votre propre terminal, demandez à Claude Code d'exécuter une commande shell inoffensive comme date ou pwd, lisez l'invite de permission qui s'affiche avant d'approuver, puis observez la sortie que Claude lit en retour avant de poursuivre.
Chaque affirmation datable de cette leçon renvoie ici au texte public qui la porte. Une source qui ne s’ouvre pas ne prouve rien.