---
title: exec
---

import VersionLabel from '@site/src/components/Docs/VersionLabel';

<VersionLabel version="0.53.0" header />

The `proto exec <tools...> -- <command>` (or `proto x`) command will activate a temporary
environment by loading and initializing any number of tools, and then execute an arbitrary command
within that environment.

```shell
$ proto exec node pnpm -- pnpm run dev
```

Tools will automatically detect a version to execute with based on loaded `.prototools`, but the
version can be provided inline by suffixing the tool with `@<version>`.

```shell
$ proto exec node@24.2 pnpm@10 -- pnpm run dev
```

### Shell support

By default, the command will not be executed in a shell, and will be excuted in the context of the
parent process. If you want to execute the command within a shell (using `-c`), you can use the
`--shell` option.

```shell
$ proto exec node pnpm --shell bash -- <command>
```

If your command contains special characters, complex expressions, or shell specific syntax, you may
need to pass `--raw` to avoid quoting/escaping issues.

```shell
$ proto exec node pnpm --shell bash --raw -- <command>
```

Furthermore, if you want to launch an interactive shell session with the activated environment, you
can pass the shell command itself as the exec command.

```shell
$ proto exec node pnpm -- bash
```

### Arguments

- `<tools...>` - List of tool identifiers with optional version.
- `<command>` - Command to execute within the environment. Must be passed after a `--` separator.

### Options

- `--tools-from-config` - Inherit tools to initialize from `.prototools` configs, instead of passing
  an explicit list.
- `--raw` - Execute the command as-is without quoting or escaping when using `--shell`.
- `--shell` - Shell to execute the command with (e.g. `bash` or `pwsh`).
