Shell-Tool (run_shell_command)
Dieses Dokument beschreibt das run_shell_command-Tool für Qwen Code.
Beschreibung
Verwenden Sie run_shell_command, um mit dem zugrunde liegenden System zu interagieren, Skripte auszuführen oder Befehlszeilenoperationen durchzuführen. run_shell_command führt einen angegebenen Shell-Befehl aus, einschließlich interaktiver Befehle, die eine Benutzereingabe erfordern (z. B. vim, git rebase -i), wenn die Einstellung tools.shell.enableInteractiveShell auf true gesetzt ist.
Unter Windows werden Befehle mit cmd.exe /c ausgeführt. Auf anderen Plattformen werden sie mit bash -c ausgeführt.
Argumente
run_shell_command akzeptiert die folgenden Argumente:
command(String, erforderlich): Der genaue Shell-Befehl, der ausgeführt werden soll.description(String, optional): Eine kurze Beschreibung des Zwecks des Befehls, die dem Benutzer angezeigt wird.directory(String, optional): Das Verzeichnis (relativ zum Projektstamm), in dem der Befehl ausgeführt werden soll. Wenn nicht angegeben, wird der Befehl im Projektstamm ausgeführt.is_background(Boolean, erforderlich): Gibt an, ob der Befehl im Hintergrund ausgeführt werden soll. Dieser Parameter ist erforderlich, um eine explizite Entscheidung über den Ausführungsmodus des Befehls zu gewährleisten. Auftruesetzen für langlaufende Prozesse wie Entwicklungsserver, Watcher oder Daemons, die weiterlaufen sollen, ohne weitere Befehle zu blockieren. Auffalsesetzen für einmalige Befehle, die abgeschlossen sein müssen, bevor fortgefahren wird.
Verwendung von run_shell_command mit Qwen Code
Bei der Verwendung von run_shell_command wird der Befehl als Subprozess ausgeführt. Du kannst steuern, ob Befehle im Hintergrund oder Vordergrund laufen, indem du den Parameter is_background verwendest oder explizit & zu den Befehlen hinzufügst. Das Tool gibt detaillierte Informationen über die Ausführung zurück, darunter:
Erforderlicher Hintergrundparameter
Der Parameter is_background ist erforderlich für alle Befehlsausführungen. Dieses Design stellt sicher, dass das LLM (und die Benutzer) bewusst entscheiden müssen, ob jeder Befehl im Hintergrund oder Vordergrund ausgeführt werden soll, was ein absichtliches und vorhersehbares Verhalten bei der Befehlsausführung fördert. Durch die obligatorische Festlegung dieses Parameters vermeiden wir unbeabsichtigte Rückgriffe auf die Vordergrundausführung, die nachfolgende Operationen blockieren könnte, wenn es sich um langlaufende Prozesse handelt.
Hintergrund- vs Vordergrundausführung
Das Tool behandelt intelligent Hintergrund- und Vordergrundausführung basierend auf Ihrer expliziten Auswahl:
Verwenden Sie die Hintergrundausführung (is_background: true) für:
- Langlaufende Entwicklungsserver:
npm run start,npm run dev,yarn dev - Build-Watcher:
npm run watch,webpack --watch - Datenbankserver:
mongod,mysql,redis-server - Webserver:
python -m http.server,php -S localhost:8000 - Jeder Befehl, der voraussichtlich unbegrenzt läuft, bis er manuell gestoppt wird
Verwenden Sie die Vordergrundausführung (is_background: false) für:
- Einmalige Befehle:
ls,cat,grep - Build-Befehle:
npm run build,make - Installationsbefehle:
npm install,pip install - Git-Operationen:
git commit,git push - Testläufe:
npm test,pytest
Ausführungs-Informationen
Das Tool gibt detaillierte Informationen über die Ausführung zurück, darunter:
Command: Der Befehl, der ausgeführt wurde.Directory: Das Verzeichnis, in dem der Befehl ausgeführt wurde.Stdout: Ausgabe vom Standardausgabestrom.Stderr: Ausgabe vom Standardfehlerstrom.Error: Jegliche Fehlermeldung, die vom Unterprozess gemeldet wurde.Exit Code: Der Exit-Code des Befehls.Signal: Die Signalnummer, falls der Befehl durch ein Signal beendet wurde.Background PIDs: Eine Liste von PIDs für alle gestarteten Hintergrundprozesse.
Verwendung:
run_shell_command(command="Ihre Befehle.", description="Ihre Beschreibung des Befehls.", directory="Ihr Ausführungsverzeichnis.", is_background=false)Hinweis: Der Parameter is_background ist erforderlich und muss bei jeder Befehlsausführung explizit angegeben werden.
run_shell_command Beispiele
Dateien im aktuellen Verzeichnis auflisten:
run_shell_command(command="ls -la", is_background=false)Ein Skript in einem bestimmten Verzeichnis ausführen:
run_shell_command(command="./my_script.sh", directory="scripts", description="Mein benutzerdefiniertes Skript ausführen", is_background=false)Einen Entwicklungsserver im Hintergrund starten (empfohlener Ansatz):
run_shell_command(command="npm run dev", description="Entwicklungsserver im Hintergrund starten", is_background=true)Einen Server im Hintergrund starten (Alternative mit explizitem &):
run_shell_command(command="npm run dev &", description="Entwicklungsserver im Hintergrund starten", is_background=false)Einen Build-Befehl im Vordergrund ausführen:
run_shell_command(command="npm run build", description="Projekt bauen", is_background=false)Mehrere Hintergrunddienste starten:
run_shell_command(command="docker-compose up", description="Alle Dienste starten", is_background=true)Konfiguration
Du kannst das Verhalten des run_shell_command-Tools konfigurieren, indem du deine settings.json-Datei bearbeitest oder den Befehl /settings im Qwen Code verwendest.
Interaktive Befehle aktivieren
Um interaktive Befehle zu aktivieren, musst du die Einstellung tools.shell.enableInteractiveShell auf true setzen. Dadurch wird node-pty für die Ausführung von Shell-Befehlen verwendet, was interaktive Sitzungen ermöglicht. Falls node-pty nicht verfügbar ist, greift das System auf die Implementierung mit child_process zurück, welche keine interaktiven Befehle unterstützt.
Beispiel settings.json:
{
"tools": {
"shell": {
"enableInteractiveShell": true
}
}
}Farbige Ausgabe anzeigen
Um Farben in der Shell-Ausgabe anzuzeigen, musst du die Einstellung tools.shell.showColor auf true setzen. Hinweis: Diese Einstellung gilt nur, wenn tools.shell.enableInteractiveShell aktiviert ist.
Beispiel settings.json:
{
"tools": {
"shell": {
"showColor": true
}
}
}Festlegen des Pagers
Sie können einen benutzerdefinierten Pager für die Shell-Ausgabe festlegen, indem Sie die Einstellung tools.shell.pager setzen. Der Standard-Pager ist cat. Hinweis: Diese Einstellung gilt nur, wenn tools.shell.enableInteractiveShell aktiviert ist.
Beispiel settings.json:
{
"tools": {
"shell": {
"pager": "less"
}
}
}Interaktive Befehle
Das Tool run_shell_command unterstützt nun interaktive Befehle durch die Integration eines Pseudo-Terminals (pty). Dadurch können Sie Befehle ausführen, die eine Echtzeiteingabe vom Benutzer erfordern, wie Texteditoren (vim, nano), Terminal-basierte Benutzeroberflächen (htop) und interaktive Versionskontrollvorgänge (git rebase -i).
Während ein interaktiver Befehl ausgeführt wird, können Sie von Qwen Code aus Eingaben an diesen senden. Um den Fokus auf die interaktive Shell zu legen, drücken Sie Strg+f. Die Terminalausgabe, einschließlich komplexer TUIs, wird korrekt dargestellt.
Wichtige Hinweise
- Sicherheit: Seien Sie vorsichtig beim Ausführen von Befehlen, insbesondere solchen, die aus Benutzereingaben konstruiert werden, um Sicherheitslücken zu vermeiden.
- Fehlerbehandlung: Prüfen Sie die Felder
Stderr,ErrorundExit Code, um festzustellen, ob ein Befehl erfolgreich ausgeführt wurde. - Hintergrundprozesse: Wenn
is_background=trueist oder wenn ein Befehl&enthält, kehrt das Tool sofort zurück und der Prozess wird im Hintergrund weiter ausgeführt. Das FeldBackground PIDsenthält die Prozess-ID des Hintergrundprozesses. - Auswahlmöglichkeiten für die Hintergrundausführung: Der Parameter
is_backgroundist erforderlich und bietet explizite Kontrolle über den Ausführungsmodus. Sie können auch manuell&zum Befehl hinzufügen, um eine Hintergrundausführung zu erzwingen, aber der Parameteris_backgroundmuss dennoch angegeben werden. Der Parameter verdeutlicht die Absicht und übernimmt automatisch die Einrichtung der Hintergrundausführung. - Befehlsbeschreibungen: Bei Verwendung von
is_background=trueenthält die Befehlsbeschreibung einen[background]-Indikator, um den Ausführungsmodus klar zu kennzeichnen.
Umgebungsvariablen
Wenn run_shell_command einen Befehl ausführt, setzt es die Umgebungsvariable QWEN_CODE=1 in der Umgebung des Unterprozesses. Dies ermöglicht es Skripten oder Tools zu erkennen, ob sie aus der CLI heraus ausgeführt werden.
Befehlseinschränkungen
Sie können die Befehle einschränken, die vom run_shell_command-Tool ausgeführt werden dürfen, indem Sie die Einstellungen tools.core und tools.exclude in Ihrer Konfigurationsdatei verwenden.
tools.core: Umrun_shell_commandauf eine bestimmte Menge von Befehlen zu beschränken, fügen Sie Einträge im Formatrun_shell_command(<Befehl>)zurcore-Liste unter der Kategorietoolshinzu. Beispiel:"tools": {"core": ["run_shell_command(git)"]}erlaubt nurgit-Befehle. Das generischerun_shell_commandohne Angabe eines konkreten Befehls wirkt wie ein Platzhalter und erlaubt jeden Befehl, der nicht explizit blockiert ist.tools.exclude: Um bestimmte Befehle zu blockieren, fügen Sie Einträge im Formatrun_shell_command(<Befehl>)zurexclude-Liste unter der Kategorietoolshinzu. Beispiel:"tools": {"exclude": ["run_shell_command(rm)"]}blockiertrm-Befehle.
Die Validierungslogik ist sicher und flexibel gestaltet:
- Befehlsverkettung deaktiviert: Das Tool trennt automatisch durch
&&,||oder;verkettete Befehle und validiert jeden Teil einzeln. Wenn ein Teil der Kette nicht erlaubt ist, wird der gesamte Befehl blockiert. - Präfix-basierte Übereinstimmung: Das Tool verwendet präfixbasierte Übereinstimmung. Wenn Sie zum Beispiel
giterlauben, können Siegit statusodergit logausführen. - Vorrang der Blockliste: Die Liste
tools.excludewird immer zuerst überprüft. Wenn ein Befehl einem blockierten Präfix entspricht, wird er abgelehnt, selbst wenn er auch einem erlaubten Präfix intools.coreentspricht.
Beispiele für Befehlseinschränkungen
Nur bestimmte Befehlspräfixe erlauben
Um nur git- und npm-Befehle zu erlauben und alle anderen zu blockieren:
{
"tools": {
"core": ["run_shell_command(git)", "run_shell_command(npm)"]
}
}git status: Erlaubtnpm install: Erlaubtls -l: Blockiert
Bestimmte Befehlspräfixe blockieren
Um rm zu blockieren und alle anderen Befehle zu erlauben:
{
"tools": {
"core": ["run_shell_command"],
"exclude": ["run_shell_command(rm)"]
}
}rm -rf /: Blockiertgit status: Erlaubtnpm install: Erlaubt
Blockliste hat Vorrang
Wenn ein Befehlspräfix sowohl in tools.core als auch in tools.exclude enthalten ist, wird es blockiert.
{
"tools": {
"core": ["run_shell_command(git)"],
"exclude": ["run_shell_command(git push)"]
}
}git push origin main: Blockiertgit status: Erlaubt
Alle Shell-Befehle blockieren
Um alle Shell-Befehle zu blockieren, fügen Sie den Platzhalter run_shell_command zu tools.exclude hinzu:
{
"tools": {
"exclude": ["run_shell_command"]
}
}ls -l: Blockiertjeder anderer Befehl: Blockiert
Sicherheitshinweis für excludeTools
Befehlsspezifische Einschränkungen in excludeTools für run_shell_command basieren auf einfacher String-Matching und können leicht umgangen werden. Diese Funktion ist kein Sicherheitsmechanismus und sollte nicht darauf verlassen werden, um nicht vertrauenswürdigen Code sicher auszuführen. Es wird empfohlen, coreTools zu verwenden, um explizit Befehle auszuwählen,
die ausgeführt werden dürfen.