Shell Tool (run_shell_command
)
Dieses Dokument beschreibt das run_shell_command
Tool für Qwen Code.
Beschreibung
Verwende run_shell_command
, um mit dem zugrunde liegenden System zu interagieren, Skripte auszuführen oder command-line Operationen durchzuführen. run_shell_command
führt einen gegebenen Shell-Befehl aus. Unter Windows wird der Befehl mit cmd.exe /c
ausgeführt. Auf anderen Plattformen wird der Befehl mit bash -c
ausgeführt.
Argumente
run_shell_command
akzeptiert die folgenden Argumente:
command
(string, erforderlich): Der exakte 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): 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. Auftrue
setzen für langlaufende Prozesse wie Entwicklungsserver, Watcher oder Daemons, die weiterlaufen sollen, ohne weitere Befehle zu blockieren. Auffalse
setzen für einmalige Befehle, die abgeschlossen werden 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 ein &
an die Befehle anhängst. Das Tool gibt detaillierte Informationen über die Ausführung zurück, darunter:
Erforderlicher Background-Parameter
Der Parameter is_background
ist erforderlich für alle Befehlsausführungen. Dieses Design stellt sicher, dass das LLM (und die Benutzer) explizit entscheiden müssen, ob jeder Befehl im Hintergrund oder Vordergrund ausgeführt werden soll. Dadurch wird ein bewusstes und vorhersehbares Verhalten bei der Befehlsausführung gefördert. Durch die obligatorische Angabe dieses Parameters wird vermieden, dass unbeabsichtigt auf die Vordergrundausführung zurückgegriffen wird, was bei lang laufenden Prozessen nachfolgende Operationen blockieren könnte.
Background vs Foreground Execution
Das Tool behandelt Background- und Foreground-Ausführung intelligent basierend auf deiner expliziten Auswahl:
Verwende Background-Ausführung (is_background: true
) für:
- Langlaufende Development-Server:
npm run start
,npm run dev
,yarn dev
- Build-Watcher:
npm run watch
,webpack --watch
- Datenbank-Server:
mongod
,mysql
,redis-server
- Web-Server:
python -m http.server
,php -S localhost:8000
- Jeder Befehl, der unbestimmt lange läuft, bis er manuell gestoppt wird
Verwende Foreground-Ausfü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 des Standard-Ausgabestreams.Stderr
: Ausgabe des Standard-Fehlerstreams.Error
: Jegliche Fehlermeldung, die vom Subprozess gemeldet wurde.Exit Code
: Der Exit-Code des Befehls.Signal
: Die Signalnummer, falls der Befehl durch ein Signal beendet wurde.Background PIDs
: Eine Liste der PIDs für alle gestarteten Hintergrundprozesse.
Verwendung:
run_shell_command(command="Your commands.", description="Your description of the command.", directory="Your execution directory.", is_background=false)
Hinweis: Der Parameter is_background
ist erforderlich und muss für jede 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="Run my custom script", is_background=false)
Einen Development-Server im Hintergrund starten (empfohlener Ansatz):
run_shell_command(command="npm run dev", description="Start development server in background", is_background=true)
Einen Server im Hintergrund starten (Alternative mit explizitem &):
run_shell_command(command="npm run dev &", description="Start development server in background", is_background=false)
Einen Build-Befehl im Vordergrund ausführen:
run_shell_command(command="npm run build", description="Build the project", is_background=false)
Mehrere Services im Hintergrund starten:
run_shell_command(command="docker-compose up", description="Start all services", is_background=true)
Wichtige Hinweise
- Sicherheit: Sei vorsichtig beim Ausführen von Befehlen, besonders solchen, die aus Benutzereingaben zusammengesetzt werden, um Sicherheitslücken zu vermeiden.
- Interaktive Befehle: Vermeide Befehle, die eine interaktive Benutzereingabe erfordern, da dies dazu führen kann, dass das Tool hängen bleibt. Verwende nach Möglichkeit nicht-interaktive Flags (z. B.
npm init -y
). - Fehlerbehandlung: Prüfe die Felder
Stderr
,Error
undExit Code
, um festzustellen, ob ein Befehl erfolgreich ausgeführt wurde. - Hintergrundprozesse: Wenn
is_background=true
ist oder wenn ein Befehl&
enthält, kehrt das Tool sofort zurück und der Prozess läuft im Hintergrund weiter. Das FeldBackground PIDs
enthält die Prozess-ID des Hintergrundprozesses. - Auswahl der Hintergrundausführung: Der Parameter
is_background
ist erforderlich und bietet explizite Kontrolle über den Ausführungsmodus. Du kannst auch&
zum Befehl hinzufügen, um die manuelle Hintergrundausführung zu erzwingen, aber der Parameteris_background
muss dennoch angegeben werden. Der Parameter macht die Absicht klarer und übernimmt automatisch das Setup für die Hintergrundausführung. - Befehlsbeschreibungen: Bei Verwendung von
is_background=true
enthält die Befehlsbeschreibung einen[background]
-Hinweis, 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 Subprozesses. Dies ermöglicht es Skripten oder Tools zu erkennen, ob sie aus der CLI heraus ausgeführt werden.
Command Restrictions
Du kannst die Befehle, die vom run_shell_command
Tool ausgeführt werden dürfen, mithilfe der Einstellungen coreTools
und excludeTools
in deiner Konfigurationsdatei einschränken.
coreTools
: Umrun_shell_command
auf eine bestimmte Menge an Befehlen zu beschränken, füge Einträge im Formatrun_shell_command(<command>)
zurcoreTools
Liste hinzu. Beispiel:"coreTools": ["run_shell_command(git)"]
erlaubt ausschließlichgit
Befehle. Der generische Eintragrun_shell_command
ohne Angabe eines konkreten Befehls wirkt wie ein Wildcard und erlaubt alle Befehle, die nicht explizit blockiert sind.excludeTools
: Um bestimmte Befehle zu blockieren, füge Einträge im Formatrun_shell_command(<command>)
zurexcludeTools
Liste hinzu. Beispiel:"excludeTools": ["run_shell_command(rm)"]
blockiert jeglicherm
Befehle.
Die Validierungslogik ist sicher und flexibel gestaltet:
- Command Chaining deaktiviert: Das Tool trennt automatisch verkettete Befehle, die mit
&&
,||
oder;
verbunden sind, und validiert jeden Teil separat. Wenn ein Teil der Kette nicht erlaubt ist, wird der gesamte Befehl blockiert. - Präfix-basiertes Matching: Das Tool verwendet Präfix-Vergleiche. Wenn du beispielsweise
git
erlaubst, kannst du auchgit status
odergit log
ausführen. - Blocklist hat Vorrang: Die
excludeTools
Liste wird immer zuerst überprüft. Wenn ein Befehl einem blockierten Präfix entspricht, wird er abgelehnt – selbst dann, wenn er gleichzeitig einem erlaubten Präfix auscoreTools
entspricht.
Beispiele für Befehlseinschränkungen
Nur bestimmte Befehlspräfixe erlauben
Um nur git
- und npm
-Befehle zu erlauben und alle anderen zu blockieren:
{
"coreTools": ["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:
{
"coreTools": ["run_shell_command"],
"excludeTools": ["run_shell_command(rm)"]
}
rm -rf /
: Blockiertgit status
: Erlaubtnpm install
: Erlaubt
Blocklist hat Vorrang
Wenn ein Befehlspräfix sowohl in coreTools
als auch in excludeTools
enthalten ist, wird es blockiert.
{
"coreTools": ["run_shell_command(git)"],
"excludeTools": ["run_shell_command(git push)"]
}
git push origin main
: Blockiertgit status
: Erlaubt
Alle Shell-Befehle blockieren
Um alle Shell-Befehle zu blockieren, füge den run_shell_command
Wildcard zu excludeTools
hinzu:
{
"excludeTools": ["run_shell_command"]
}
ls -l
: Blockiertany other command
: 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 die Befehle auszuwählen, die ausgeführt werden dürfen.