Aller au contenu
Mastering Claude

Accueil / Fondamentaux et boucle d'agent

Fondamentaux et boucle d'agent8 minFondation

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.

Figure 1

De la commande proposée à la poursuite du raisonnement

01
Claude propose une commande
L'outil Bash reçoit la commande shell choisie pour répondre à la demande en cours.
02
Une invite de permission s'affiche
Sauf pour un jeu intégré de commandes en lecture seule, qui s'exécutent directement sans arrêt.
03
Vous approuvez ou refusez
L'option qui mémorise le choix rend la commande approuvée de façon permanente pour ce dépôt et cette commande.
04
La commande s'exécute
Le shell tourne réellement sur le poste, avec ses effets réels sur les fichiers et les processus.
05
Claude lit stdout et stderr
La sortie standard et la sortie d'erreur sont lues telles quelles, sans reconstitution.
06
Le raisonnement se poursuit
La suite de la boucle d'agent s'appuie sur ce que la commande a réellement produit.
La séquence montre les six étapes d'un appel à l'outil Bash, depuis la commande proposée par Claude jusqu'à la reprise du raisonnement sur la sortie réellement obtenue.
Figure 2

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 foisInvite affichée les fois suivantes
npm test, commande simple déjà approuvéeOuiNon, elle s'exécute directement
find avec un motif global non protégé dans ses argumentsOuiOui, l'invite réapparaît à chaque fois
Le tableau compare deux commandes envoyées à l'outil Bash sur un dépôt où une commande simple est déjà approuvée, selon qu'un motif global non protégé figure ou non dans les arguments d'une commande capable d'écrire.
Calibrez vous-même

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 qu’il faut retenir
  • 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.
À faire maintenant

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.

Vérifier à la source

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.