|
Download docs/tools/shell.md from SaylorTwift/gemini-cli: direct link, hf CLI and curl.
- Browser
- Download file 7.94 kB
-
https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/tools/shell.md
- Command line
-
hf download hf://SaylorTwift/gemini-cli/docs/tools/shell.md
-
curl -L -o shell.md https://huggingface.co/SaylorTwift/gemini-cli/resolve/main/docs/tools/shell.md
7.94 kB
| # Shell tool (`run_shell_command`) | |
| The `run_shell_command` tool allows the Gemini model to execute commands | |
| directly on your system's shell. It is the primary mechanism for the agent to | |
| interact with your environment beyond simple file edits. | |
| ## Technical reference | |
| On Windows, commands execute with `powershell.exe -NoProfile -Command`. On other | |
| platforms, they execute with `bash -c`. | |
| ### Arguments | |
| - `command` (string, required): The exact shell command to execute. | |
| - `description` (string, optional): A brief description shown to the user for | |
| confirmation. | |
| - `dir_path` (string, optional): The absolute path or relative path from | |
| workspace root where the command runs. | |
| - `is_background` (boolean, optional): Whether to move the process to the | |
| background immediately after starting. | |
| ### Policy engine shorthands | |
| The [policy engine](../reference/policy-engine.md) provides two convenience | |
| fields for writing rules that target shell commands: | |
| - `commandPrefix`: Matches if the `command` argument starts with a given string. | |
| - `commandRegex`: Matches if the `command` argument matches a given regular | |
| expression. | |
| These are syntactic sugar for combining `toolName = "run_shell_command"` with an | |
| `argsPattern` in a policy TOML file. They are **not** arguments of | |
| `run_shell_command` itself. | |
| For details on writing shell-specific policy rules, see | |
| [Special syntax for `run_shell_command`](../reference/policy-engine.md#special-syntax-for-run_shell_command) | |
| in the policy engine reference. | |
| ### Return values | |
| The tool returns a JSON object containing: | |
| - `Command`: The executed string. | |
| - `Directory`: The execution path. | |
| - `Stdout` / `Stderr`: The output streams. | |
| - `Exit Code`: The process return code. | |
| - `Background PIDs`: PIDs of any started background processes. | |
| ## Configuration | |
| You can configure the behavior of the `run_shell_command` tool by modifying your | |
| `settings.json` file or by using the `/settings` command in Gemini CLI. | |
| ### Enabling interactive commands | |
| To enable interactive commands, you need to set the | |
| `tools.shell.enableInteractiveShell` setting to `true`. This will use `node-pty` | |
| for shell command execution, which allows for interactive sessions. If | |
| `node-pty` is not available, it will fall back to the `child_process` | |
| implementation, which does not support interactive commands. | |
| **Example `settings.json`:** | |
| ```json | |
| { | |
| "tools": { | |
| "shell": { | |
| "enableInteractiveShell": true | |
| } | |
| } | |
| } | |
| ``` | |
| ### Showing color in output | |
| To show color in the shell output, you need to set the `tools.shell.showColor` | |
| setting to `true`. This setting only applies when | |
| `tools.shell.enableInteractiveShell` is enabled. | |
| **Example `settings.json`:** | |
| ```json | |
| { | |
| "tools": { | |
| "shell": { | |
| "showColor": true | |
| } | |
| } | |
| } | |
| ``` | |
| ### Setting the pager | |
| You can set a custom pager for the shell output by setting the | |
| `tools.shell.pager` setting. The default pager is `cat`. This setting only | |
| applies when `tools.shell.enableInteractiveShell` is enabled. | |
| **Example `settings.json`:** | |
| ```json | |
| { | |
| "tools": { | |
| "shell": { | |
| "pager": "less" | |
| } | |
| } | |
| } | |
| ``` | |
| ## Interactive commands | |
| The `run_shell_command` tool now supports interactive commands by integrating a | |
| pseudo-terminal (pty). This lets you run commands that require real-time user | |
| input, such as text editors (`vim`, `nano`), terminal-based UIs (`htop`), and | |
| interactive version control operations (`git rebase -i`). | |
| When an interactive command is running, you can send input to it from the Gemini | |
| CLI. To focus on the interactive shell, press `Tab`. The terminal output, | |
| including complex TUIs, will be rendered correctly. | |
| ## Important notes | |
| - **Security:** Be cautious when executing commands, especially those | |
| constructed from user input, to prevent security vulnerabilities. | |
| - **Error handling:** Check the `Stderr`, `Error`, and `Exit Code` fields to | |
| determine if a command executed successfully. | |
| - **Background processes:** When a command is run in the background with `&`, | |
| the tool will return immediately and the process will continue to run in the | |
| background. The `Background PIDs` field will contain the process ID of the | |
| background process. | |
| ## Environment variables | |
| When `run_shell_command` executes a command, it sets the `GEMINI_CLI=1` | |
| environment variable in the subprocess's environment. This allows scripts or | |
| tools to detect if they are being run from within Gemini CLI. | |
| ## Command restrictions | |
| <!-- prettier-ignore --> | |
| > [!WARNING] | |
| > The `tools.core` setting is an **allowlist for _all_ built-in | |
| > tools**, not just shell commands. When you set `tools.core` to any value, | |
| > _only_ the tools explicitly listed will be enabled. This includes all built-in | |
| > tools like `read_file`, `write_file`, `glob`, `grep_search`, `list_directory`, | |
| > `replace`, etc. | |
| You can restrict the commands that can be executed by the `run_shell_command` | |
| tool by using the `tools.core` and `tools.exclude` settings in your | |
| configuration file. | |
| - `tools.core`: To restrict `run_shell_command` to a specific set of commands, | |
| add entries to the `core` list under the `tools` category in the format | |
| `run_shell_command(<command>)`. For example, | |
| `"tools": {"core": ["run_shell_command(git)"]}` will only allow `git` | |
| commands. Including the generic `run_shell_command` acts as a wildcard, | |
| allowing any command not explicitly blocked. | |
| - `tools.exclude` [DEPRECATED]: To block specific commands, use the | |
| [Policy Engine](../reference/policy-engine.md). Historically, this setting | |
| allowed adding entries to the `exclude` list under the `tools` category in the | |
| format `run_shell_command(<command>)`. For example, | |
| `"tools": {"exclude": ["run_shell_command(rm)"]}` will block `rm` commands. | |
| The validation logic is designed to be secure and flexible: | |
| 1. **Command chaining disabled**: The tool automatically splits commands | |
| chained with `&&`, `||`, or `;` and validates each part separately. If any | |
| part of the chain is disallowed, the entire command is blocked. | |
| 2. **Prefix matching**: The tool uses prefix matching. For example, if you | |
| allow `git`, you can run `git status` or `git log`. | |
| 3. **Blocklist precedence**: The `tools.exclude` list is always checked first. | |
| If a command matches a blocked prefix, it will be denied, even if it also | |
| matches an allowed prefix in `tools.core`. | |
| ### Command restriction examples | |
| **Allow only specific command prefixes** | |
| To allow only `git` and `npm` commands, and block all others: | |
| ```json | |
| { | |
| "tools": { | |
| "core": ["run_shell_command(git)", "run_shell_command(npm)"] | |
| } | |
| } | |
| ``` | |
| - `git status`: Allowed | |
| - `npm install`: Allowed | |
| - `ls -l`: Blocked | |
| **Block specific command prefixes** | |
| To block `rm` and allow all other commands: | |
| ```json | |
| { | |
| "tools": { | |
| "core": ["run_shell_command"], | |
| "exclude": ["run_shell_command(rm)"] | |
| } | |
| } | |
| ``` | |
| - `rm -rf /`: Blocked | |
| - `git status`: Allowed | |
| - `npm install`: Allowed | |
| **Blocklist takes precedence** | |
| If a command prefix is in both `tools.core` and `tools.exclude`, it will be | |
| blocked. | |
| - **`tools.shell.enableInteractiveShell`**: (boolean) Uses `node-pty` for | |
| real-time interaction. | |
| - **`tools.shell.showColor`**: (boolean) Preserves ANSI colors in output. | |
| - **`tools.shell.inactivityTimeout`**: (number) Seconds to wait for output | |
| before killing the process. | |
| ### Command restrictions | |
| You can limit which commands the agent is allowed to request using these | |
| settings: | |
| - **`tools.core`**: An allowlist of command prefixes (for example, | |
| `["git", "npm test"]`). | |
| - **`tools.exclude`**: A blocklist of command prefixes. | |
| ## Use cases | |
| - Running build scripts and test suites. | |
| - Initializing or managing version control systems. | |
| - Installing project dependencies. | |
| - Starting development servers or background watchers. | |
| ## Next steps | |
| - Follow the [Shell commands tutorial](../cli/tutorials/shell-commands.md) for | |
| practical examples. | |
| - Learn about [Sandboxing](../cli/sandbox.md) to isolate command execution. | |