time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

readme.md (24960B)


      1 <picture>
      2 	<source media="(prefers-color-scheme: dark)" srcset="media/logo_dark.svg">
      3 	<img alt="execa logo" src="media/logo.svg" width="400">
      4 </picture>
      5 <br>
      6 
      7 [![Coverage Status](https://codecov.io/gh/sindresorhus/execa/branch/main/graph/badge.svg)](https://codecov.io/gh/sindresorhus/execa)
      8 
      9 > Process execution for humans
     10 
     11 <br>
     12 
     13 ---
     14 
     15 <div align="center">
     16 	<p>
     17 		<p>
     18 			<sup>
     19 				<a href="https://github.com/sponsors/sindresorhus">Sindre's open source work is supported by the community</a>
     20 			</sup>
     21 		</p>
     22 		<sup>Special thanks to:</sup>
     23 		<br>
     24 		<br>
     25 		<a href="https://transloadit.com">
     26 			<picture>
     27 				<source width="360" media="(prefers-color-scheme: dark)" srcset="https://sindresorhus.com/assets/thanks/transloadit-logo-dark.svg">
     28 				<source width="360" media="(prefers-color-scheme: light)" srcset="https://sindresorhus.com/assets/thanks/transloadit-logo.svg">
     29 				<img width="360" src="https://sindresorhus.com/assets/thanks/transloadit-logo.svg" alt="Transloadit logo">
     30 			</picture>
     31 		</a>
     32 		<br>
     33 		<br>
     34 	</p>
     35 </div>
     36 
     37 ---
     38 
     39 <br>
     40 
     41 ## Why
     42 
     43 This package improves [`child_process`](https://nodejs.org/api/child_process.html) methods with:
     44 
     45 - [Promise interface](#execacommandcommand-options).
     46 - [Scripts interface](#scripts-interface), like `zx`.
     47 - Improved [Windows support](https://github.com/IndigoUnited/node-cross-spawn#why), including [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) binaries.
     48 - Executes [locally installed binaries](#preferlocal) without `npx`.
     49 - [Cleans up](#cleanup) child processes when the parent process ends.
     50 - [Graceful termination](#optionsforcekillaftertimeout).
     51 - Get [interleaved output](#all) from `stdout` and `stderr` similar to what is printed on the terminal.
     52 - [Strips the final newline](#stripfinalnewline) from the output so you don't have to do `stdout.trim()`.
     53 - Convenience methods to pipe processes' [input](#input) and [output](#redirect-output-to-a-file).
     54 - Can specify file and arguments [as a single string](#execacommandcommand-options) without a shell.
     55 - [Verbose mode](#verbose-mode) for debugging.
     56 - More descriptive errors.
     57 - Higher max buffer: 100 MB instead of 1 MB.
     58 
     59 ## Install
     60 
     61 ```sh
     62 npm install execa
     63 ```
     64 
     65 ## Usage
     66 
     67 ### Promise interface
     68 
     69 ```js
     70 import {execa} from 'execa';
     71 
     72 const {stdout} = await execa('echo', ['unicorns']);
     73 console.log(stdout);
     74 //=> 'unicorns'
     75 ```
     76 
     77 ### Scripts interface
     78 
     79 For more information about Execa scripts, please see [this page](docs/scripts.md).
     80 
     81 #### Basic
     82 
     83 ```js
     84 import {$} from 'execa';
     85 
     86 const branch = await $`git branch --show-current`;
     87 await $`dep deploy --branch=${branch}`;
     88 ```
     89 
     90 #### Multiple arguments
     91 
     92 ```js
     93 import {$} from 'execa';
     94 
     95 const args = ['unicorns', '&', 'rainbows!'];
     96 const {stdout} = await $`echo ${args}`;
     97 console.log(stdout);
     98 //=> 'unicorns & rainbows!'
     99 ```
    100 
    101 #### With options
    102 
    103 ```js
    104 import {$} from 'execa';
    105 
    106 await $({stdio: 'inherit'})`echo unicorns`;
    107 //=> 'unicorns'
    108 ```
    109 
    110 #### Shared options
    111 
    112 ```js
    113 import {$} from 'execa';
    114 
    115 const $$ = $({stdio: 'inherit'});
    116 
    117 await $$`echo unicorns`;
    118 //=> 'unicorns'
    119 
    120 await $$`echo rainbows`;
    121 //=> 'rainbows'
    122 ```
    123 
    124 #### Verbose mode
    125 
    126 ```sh
    127 > node file.js
    128 unicorns
    129 rainbows
    130 
    131 > NODE_DEBUG=execa node file.js
    132 [16:50:03.305] echo unicorns
    133 unicorns
    134 [16:50:03.308] echo rainbows
    135 rainbows
    136 ```
    137 
    138 ### Input/output
    139 
    140 #### Redirect output to a file
    141 
    142 ```js
    143 import {execa} from 'execa';
    144 
    145 // Similar to `echo unicorns > stdout.txt` in Bash
    146 await execa('echo', ['unicorns']).pipeStdout('stdout.txt');
    147 
    148 // Similar to `echo unicorns 2> stdout.txt` in Bash
    149 await execa('echo', ['unicorns']).pipeStderr('stderr.txt');
    150 
    151 // Similar to `echo unicorns &> stdout.txt` in Bash
    152 await execa('echo', ['unicorns'], {all: true}).pipeAll('all.txt');
    153 ```
    154 
    155 #### Redirect input from a file
    156 
    157 ```js
    158 import {execa} from 'execa';
    159 
    160 // Similar to `cat < stdin.txt` in Bash
    161 const {stdout} = await execa('cat', {inputFile: 'stdin.txt'});
    162 console.log(stdout);
    163 //=> 'unicorns'
    164 ```
    165 
    166 #### Save and pipe output from a child process
    167 
    168 ```js
    169 import {execa} from 'execa';
    170 
    171 const {stdout} = await execa('echo', ['unicorns']).pipeStdout(process.stdout);
    172 // Prints `unicorns`
    173 console.log(stdout);
    174 // Also returns 'unicorns'
    175 ```
    176 
    177 #### Pipe multiple processes
    178 
    179 ```js
    180 import {execa} from 'execa';
    181 
    182 // Similar to `echo unicorns | cat` in Bash
    183 const {stdout} = await execa('echo', ['unicorns']).pipeStdout(execa('cat'));
    184 console.log(stdout);
    185 //=> 'unicorns'
    186 ```
    187 
    188 ### Handling Errors
    189 
    190 ```js
    191 import {execa} from 'execa';
    192 
    193 // Catching an error
    194 try {
    195 	await execa('unknown', ['command']);
    196 } catch (error) {
    197 	console.log(error);
    198 	/*
    199 	{
    200 		message: 'Command failed with ENOENT: unknown command spawn unknown ENOENT',
    201 		errno: -2,
    202 		code: 'ENOENT',
    203 		syscall: 'spawn unknown',
    204 		path: 'unknown',
    205 		spawnargs: ['command'],
    206 		originalMessage: 'spawn unknown ENOENT',
    207 		shortMessage: 'Command failed with ENOENT: unknown command spawn unknown ENOENT',
    208 		command: 'unknown command',
    209 		escapedCommand: 'unknown command',
    210 		stdout: '',
    211 		stderr: '',
    212 		failed: true,
    213 		timedOut: false,
    214 		isCanceled: false,
    215 		killed: false
    216 	}
    217 	*/
    218 }
    219 ```
    220 
    221 ### Graceful termination
    222 
    223 Using SIGTERM, and after 2 seconds, kill it with SIGKILL.
    224 
    225 ```js
    226 const subprocess = execa('node');
    227 
    228 setTimeout(() => {
    229 	subprocess.kill('SIGTERM', {
    230 		forceKillAfterTimeout: 2000
    231 	});
    232 }, 1000);
    233 ```
    234 
    235 ## API
    236 
    237 ### Methods
    238 
    239 #### execa(file, arguments?, options?)
    240 
    241 Executes a command using `file ...arguments`. `arguments` are specified as an array of strings. Returns a [`childProcess`](#childprocess).
    242 
    243 Arguments are [automatically escaped](#shell-syntax). They can contain any character, including spaces.
    244 
    245 This is the preferred method when executing single commands.
    246 
    247 #### execaNode(scriptPath, arguments?, options?)
    248 
    249 Executes a Node.js file using `node scriptPath ...arguments`. `arguments` are specified as an array of strings. Returns a [`childProcess`](#childprocess).
    250 
    251 Arguments are [automatically escaped](#shell-syntax). They can contain any character, including spaces.
    252 
    253 This is the preferred method when executing Node.js files.
    254 
    255 Like [`child_process#fork()`](https://nodejs.org/api/child_process.html#child_process_child_process_fork_modulepath_args_options):
    256   - the current Node version and options are used. This can be overridden using the [`nodePath`](#nodepath-for-node-only) and [`nodeOptions`](#nodeoptions-for-node-only) options.
    257   - the [`shell`](#shell) option cannot be used
    258   - an extra channel [`ipc`](https://nodejs.org/api/child_process.html#child_process_options_stdio) is passed to [`stdio`](#stdio)
    259 
    260 #### $\`command\`
    261 
    262 Executes a command. The `command` string includes both the `file` and its `arguments`. Returns a [`childProcess`](#childprocess).
    263 
    264 Arguments are [automatically escaped](#shell-syntax). They can contain any character, but spaces must use `${}` like `` $`echo ${'has space'}` ``.
    265 
    266 This is the preferred method when executing multiple commands in a script file.
    267 
    268 The `command` string can inject any `${value}` with the following types: string, number, [`childProcess`](#childprocess) or an array of those types. For example: `` $`echo one ${'two'} ${3} ${['four', 'five']}` ``. For `${childProcess}`, the process's `stdout` is used.
    269 
    270 For more information, please see [this section](#scripts-interface) and [this page](docs/scripts.md).
    271 
    272 #### $(options)
    273 
    274 Returns a new instance of [`$`](#command) but with different default `options`. Consecutive calls are merged to previous ones.
    275 
    276 This can be used to either:
    277   - Set options for a specific command: `` $(options)`command` ``
    278   - Share options for multiple commands: `` const $$ = $(options); $$`command`; $$`otherCommand`; ``
    279 
    280 #### execaCommand(command, options?)
    281 
    282 Executes a command. The `command` string includes both the `file` and its `arguments`. Returns a [`childProcess`](#childprocess).
    283 
    284 Arguments are [automatically escaped](#shell-syntax). They can contain any character, but spaces must be escaped with a backslash like `execaCommand('echo has\\ space')`.
    285 
    286 This is the preferred method when executing a user-supplied `command` string, such as in a REPL.
    287 
    288 ### execaSync(file, arguments?, options?)
    289 
    290 Same as [`execa()`](#execacommandcommand-options) but synchronous.
    291 
    292 Returns or throws a [`childProcessResult`](#childProcessResult).
    293 
    294 ### $.sync\`command\`
    295 
    296 Same as [$\`command\`](#command) but synchronous.
    297 
    298 Returns or throws a [`childProcessResult`](#childProcessResult).
    299 
    300 ### execaCommandSync(command, options?)
    301 
    302 Same as [`execaCommand()`](#execacommand-command-options) but synchronous.
    303 
    304 Returns or throws a [`childProcessResult`](#childProcessResult).
    305 
    306 ### Shell syntax
    307 
    308 For all the [methods above](#methods), no shell interpreter (Bash, cmd.exe, etc.) is used unless the [`shell` option](#shell) is set. This means shell-specific characters and expressions (`$variable`, `&&`, `||`, `;`, `|`, etc.) have no special meaning and do not need to be escaped.
    309 
    310 ### childProcess
    311 
    312 The return value of all [asynchronous methods](#methods) is both:
    313   - a `Promise` resolving or rejecting with a [`childProcessResult`](#childProcessResult).
    314   - a [`child_process` instance](https://nodejs.org/api/child_process.html#child_process_class_childprocess) with the following additional methods and properties.
    315 
    316 #### kill(signal?, options?)
    317 
    318 Same as the original [`child_process#kill()`](https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal) except: if `signal` is `SIGTERM` (the default value) and the child process is not terminated after 5 seconds, force it by sending `SIGKILL`.
    319 
    320 Note that this graceful termination does not work on Windows, because Windows [doesn't support signals](https://nodejs.org/api/process.html#process_signal_events) (`SIGKILL` and `SIGTERM` has the same effect of force-killing the process immediately.) If you want to achieve graceful termination on Windows, you have to use other means, such as [`taskkill`](https://github.com/sindresorhus/taskkill).
    321 
    322 ##### options.forceKillAfterTimeout
    323 
    324 Type: `number | false`\
    325 Default: `5000`
    326 
    327 Milliseconds to wait for the child process to terminate before sending `SIGKILL`.
    328 
    329 Can be disabled with `false`.
    330 
    331 #### all
    332 
    333 Type: `ReadableStream | undefined`
    334 
    335 Stream combining/interleaving [`stdout`](https://nodejs.org/api/child_process.html#child_process_subprocess_stdout) and [`stderr`](https://nodejs.org/api/child_process.html#child_process_subprocess_stderr).
    336 
    337 This is `undefined` if either:
    338   - the [`all` option](#all-2) is `false` (the default value)
    339   - both [`stdout`](#stdout-1) and [`stderr`](#stderr-1) options are set to [`'inherit'`, `'ipc'`, `Stream` or `integer`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio)
    340 
    341 #### pipeStdout(target)
    342 
    343 [Pipe](https://nodejs.org/api/stream.html#readablepipedestination-options) the child process's `stdout` to `target`, which can be:
    344   - Another [`execa()` return value](#pipe-multiple-processes)
    345   - A [writable stream](#save-and-pipe-output-from-a-child-process)
    346   - A [file path string](#redirect-output-to-a-file)
    347 
    348 If the `target` is another [`execa()` return value](#execacommandcommand-options), it is returned. Otherwise, the original `execa()` return value is returned. This allows chaining `pipeStdout()` then `await`ing the [final result](#childprocessresult).
    349 
    350 The [`stdout` option](#stdout-1) must be kept as `pipe`, its default value.
    351 
    352 #### pipeStderr(target)
    353 
    354 Like [`pipeStdout()`](#pipestdouttarget) but piping the child process's `stderr` instead.
    355 
    356 The [`stderr` option](#stderr-1) must be kept as `pipe`, its default value.
    357 
    358 #### pipeAll(target)
    359 
    360 Combines both [`pipeStdout()`](#pipestdouttarget) and [`pipeStderr()`](#pipestderrtarget).
    361 
    362 Either the [`stdout` option](#stdout-1) or the [`stderr` option](#stderr-1) must be kept as `pipe`, their default value. Also, the [`all` option](#all-2) must be set to `true`.
    363 
    364 ### childProcessResult
    365 
    366 Type: `object`
    367 
    368 Result of a child process execution. On success this is a plain object. On failure this is also an `Error` instance.
    369 
    370 The child process [fails](#failed) when:
    371 - its [exit code](#exitcode) is not `0`
    372 - it was [killed](#killed) with a [signal](#signal)
    373 - [timing out](#timedout)
    374 - [being canceled](#iscanceled)
    375 - there's not enough memory or there are already too many child processes
    376 
    377 #### command
    378 
    379 Type: `string`
    380 
    381 The file and arguments that were run, for logging purposes.
    382 
    383 This is not escaped and should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options).
    384 
    385 #### escapedCommand
    386 
    387 Type: `string`
    388 
    389 Same as [`command`](#command-1) but escaped.
    390 
    391 This is meant to be copy and pasted into a shell, for debugging purposes.
    392 Since the escaping is fairly basic, this should not be executed directly as a process, including using [`execa()`](#execafile-arguments-options) or [`execaCommand()`](#execacommandcommand-options).
    393 
    394 #### exitCode
    395 
    396 Type: `number`
    397 
    398 The numeric exit code of the process that was run.
    399 
    400 #### stdout
    401 
    402 Type: `string | Buffer`
    403 
    404 The output of the process on stdout.
    405 
    406 #### stderr
    407 
    408 Type: `string | Buffer`
    409 
    410 The output of the process on stderr.
    411 
    412 #### all
    413 
    414 Type: `string | Buffer | undefined`
    415 
    416 The output of the process with `stdout` and `stderr` interleaved.
    417 
    418 This is `undefined` if either:
    419   - the [`all` option](#all-2) is `false` (the default value)
    420   - `execaSync()` was used
    421 
    422 #### failed
    423 
    424 Type: `boolean`
    425 
    426 Whether the process failed to run.
    427 
    428 #### timedOut
    429 
    430 Type: `boolean`
    431 
    432 Whether the process timed out.
    433 
    434 #### isCanceled
    435 
    436 Type: `boolean`
    437 
    438 Whether the process was canceled.
    439 
    440 You can cancel the spawned process using the [`signal`](#signal-1) option.
    441 
    442 #### killed
    443 
    444 Type: `boolean`
    445 
    446 Whether the process was killed.
    447 
    448 #### signal
    449 
    450 Type: `string | undefined`
    451 
    452 The name of the signal that was used to terminate the process. For example, `SIGFPE`.
    453 
    454 If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`.
    455 
    456 #### signalDescription
    457 
    458 Type: `string | undefined`
    459 
    460 A human-friendly description of the signal that was used to terminate the process. For example, `Floating point arithmetic error`.
    461 
    462 If a signal terminated the process, this property is defined and included in the error message. Otherwise it is `undefined`. It is also `undefined` when the signal is very uncommon which should seldomly happen.
    463 
    464 #### cwd
    465 
    466 Type: `string`
    467 
    468 The `cwd` of the command if provided in the [command options](#cwd-1). Otherwise it is `process.cwd()`.
    469 
    470 #### message
    471 
    472 Type: `string`
    473 
    474 Error message when the child process failed to run. In addition to the [underlying error message](#originalMessage), it also contains some information related to why the child process errored.
    475 
    476 The child process [stderr](#stderr) then [stdout](#stdout) are appended to the end, separated with newlines and not interleaved.
    477 
    478 #### shortMessage
    479 
    480 Type: `string`
    481 
    482 This is the same as the [`message` property](#message) except it does not include the child process stdout/stderr.
    483 
    484 #### originalMessage
    485 
    486 Type: `string | undefined`
    487 
    488 Original error message. This is the same as the `message` property except it includes neither the child process stdout/stderr nor some additional information added by Execa.
    489 
    490 This is `undefined` unless the child process exited due to an `error` event or a timeout.
    491 
    492 ### options
    493 
    494 Type: `object`
    495 
    496 #### cleanup
    497 
    498 Type: `boolean`\
    499 Default: `true`
    500 
    501 Kill the spawned process when the parent process exits unless either:
    502 	- the spawned process is [`detached`](https://nodejs.org/api/child_process.html#child_process_options_detached)
    503 	- the parent process is terminated abruptly, for example, with `SIGKILL` as opposed to `SIGTERM` or a normal exit
    504 
    505 #### preferLocal
    506 
    507 Type: `boolean`\
    508 Default: `true` with [`$`](#command), `false` otherwise
    509 
    510 Prefer locally installed binaries when looking for a binary to execute.\
    511 If you `$ npm install foo`, you can then `execa('foo')`.
    512 
    513 #### localDir
    514 
    515 Type: `string | URL`\
    516 Default: `process.cwd()`
    517 
    518 Preferred path to find locally installed binaries in (use with `preferLocal`).
    519 
    520 #### execPath
    521 
    522 Type: `string`\
    523 Default: `process.execPath` (Current Node.js executable)
    524 
    525 Path to the Node.js executable to use in child processes.
    526 
    527 This can be either an absolute path or a path relative to the [`cwd` option](#cwd).
    528 
    529 Requires [`preferLocal`](#preferlocal) to be `true`.
    530 
    531 For example, this can be used together with [`get-node`](https://github.com/ehmicky/get-node) to run a specific Node.js version in a child process.
    532 
    533 #### buffer
    534 
    535 Type: `boolean`\
    536 Default: `true`
    537 
    538 Buffer the output from the spawned process. When set to `false`, you must read the output of [`stdout`](#stdout-1) and [`stderr`](#stderr-1) (or [`all`](#all) if the [`all`](#all-2) option is `true`). Otherwise the returned promise will not be resolved/rejected.
    539 
    540 If the spawned process fails, [`error.stdout`](#stdout), [`error.stderr`](#stderr), and [`error.all`](#all) will contain the buffered data.
    541 
    542 #### input
    543 
    544 Type: `string | Buffer | stream.Readable`
    545 
    546 Write some input to the `stdin` of your binary.\
    547 Streams are not allowed when using the synchronous methods.
    548 
    549 If the input is a file, use the [`inputFile` option](#inputfile) instead.
    550 
    551 #### inputFile
    552 
    553 Type: `string`
    554 
    555 Use a file as input to the the `stdin` of your binary.
    556 
    557 If the input is not a file, use the [`input` option](#input) instead.
    558 
    559 #### stdin
    560 
    561 Type: `string | number | Stream | undefined`\
    562 Default: `inherit` with [`$`](#command), `pipe` otherwise
    563 
    564 Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
    565 
    566 #### stdout
    567 
    568 Type: `string | number | Stream | undefined`\
    569 Default: `pipe`
    570 
    571 Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
    572 
    573 #### stderr
    574 
    575 Type: `string | number | Stream | undefined`\
    576 Default: `pipe`
    577 
    578 Same options as [`stdio`](https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_options_stdio).
    579 
    580 #### all
    581 
    582 Type: `boolean`\
    583 Default: `false`
    584 
    585 Add an `.all` property on the [promise](#all) and the [resolved value](#all-1). The property contains the output of the process with `stdout` and `stderr` interleaved.
    586 
    587 #### reject
    588 
    589 Type: `boolean`\
    590 Default: `true`
    591 
    592 Setting this to `false` resolves the promise with the error instead of rejecting it.
    593 
    594 #### stripFinalNewline
    595 
    596 Type: `boolean`\
    597 Default: `true`
    598 
    599 Strip the final [newline character](https://en.wikipedia.org/wiki/Newline) from the output.
    600 
    601 #### extendEnv
    602 
    603 Type: `boolean`\
    604 Default: `true`
    605 
    606 Set to `false` if you don't want to extend the environment variables when providing the `env` property.
    607 
    608 ---
    609 
    610 Execa also accepts the below options which are the same as the options for [`child_process#spawn()`](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options)/[`child_process#exec()`](https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback)
    611 
    612 #### cwd
    613 
    614 Type: `string | URL`\
    615 Default: `process.cwd()`
    616 
    617 Current working directory of the child process.
    618 
    619 #### env
    620 
    621 Type: `object`\
    622 Default: `process.env`
    623 
    624 Environment key-value pairs. Extends automatically from `process.env`. Set [`extendEnv`](#extendenv) to `false` if you don't want this.
    625 
    626 #### argv0
    627 
    628 Type: `string`
    629 
    630 Explicitly set the value of `argv[0]` sent to the child process. This will be set to `file` if not specified.
    631 
    632 #### stdio
    633 
    634 Type: `string | string[]`\
    635 Default: `pipe`
    636 
    637 Child's [stdio](https://nodejs.org/api/child_process.html#child_process_options_stdio) configuration.
    638 
    639 #### serialization
    640 
    641 Type: `string`\
    642 Default: `'json'`
    643 
    644 Specify the kind of serialization used for sending messages between processes when using the [`stdio: 'ipc'`](#stdio) option or [`execaNode()`](#execanodescriptpath-arguments-options):
    645 	- `json`: Uses `JSON.stringify()` and `JSON.parse()`.
    646 	- `advanced`: Uses [`v8.serialize()`](https://nodejs.org/api/v8.html#v8_v8_serialize_value)
    647 
    648 [More info.](https://nodejs.org/api/child_process.html#child_process_advanced_serialization)
    649 
    650 #### detached
    651 
    652 Type: `boolean`
    653 
    654 Prepare child to run independently of its parent process. Specific behavior [depends on the platform](https://nodejs.org/api/child_process.html#child_process_options_detached).
    655 
    656 #### uid
    657 
    658 Type: `number`
    659 
    660 Sets the user identity of the process.
    661 
    662 #### gid
    663 
    664 Type: `number`
    665 
    666 Sets the group identity of the process.
    667 
    668 #### shell
    669 
    670 Type: `boolean | string`\
    671 Default: `false`
    672 
    673 If `true`, runs `file` inside of a shell. Uses `/bin/sh` on UNIX and `cmd.exe` on Windows. A different shell can be specified as a string. The shell should understand the `-c` switch on UNIX or `/d /s /c` on Windows.
    674 
    675 We recommend against using this option since it is:
    676 - not cross-platform, encouraging shell-specific syntax.
    677 - slower, because of the additional shell interpretation.
    678 - unsafe, potentially allowing command injection.
    679 
    680 #### encoding
    681 
    682 Type: `string | null`\
    683 Default: `utf8`
    684 
    685 Specify the character encoding used to decode the `stdout` and `stderr` output. If set to `null`, then `stdout` and `stderr` will be a `Buffer` instead of a string.
    686 
    687 #### timeout
    688 
    689 Type: `number`\
    690 Default: `0`
    691 
    692 If timeout is greater than `0`, the parent will send the signal identified by the `killSignal` property (the default is `SIGTERM`) if the child runs longer than timeout milliseconds.
    693 
    694 #### maxBuffer
    695 
    696 Type: `number`\
    697 Default: `100_000_000` (100 MB)
    698 
    699 Largest amount of data in bytes allowed on `stdout` or `stderr`.
    700 
    701 #### killSignal
    702 
    703 Type: `string | number`\
    704 Default: `SIGTERM`
    705 
    706 Signal value to be used when the spawned process will be killed.
    707 
    708 #### signal
    709 
    710 Type: [`AbortSignal`](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal)
    711 
    712 You can abort the spawned process using [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController).
    713 
    714 When `AbortController.abort()` is called, [`.isCanceled`](#iscanceled) becomes `false`.
    715 
    716 *Requires Node.js 16 or later.*
    717 
    718 #### windowsVerbatimArguments
    719 
    720 Type: `boolean`\
    721 Default: `false`
    722 
    723 If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`.
    724 
    725 #### windowsHide
    726 
    727 Type: `boolean`\
    728 Default: `true`
    729 
    730 On Windows, do not create a new console window. Please note this also prevents `CTRL-C` [from working](https://github.com/nodejs/node/issues/29837) on Windows.
    731 
    732 #### verbose
    733 
    734 Type: `boolean`\
    735 Default: `false`
    736 
    737 [Print each command](#verbose-mode) on `stderr` before executing it.
    738 
    739 This can also be enabled by setting the `NODE_DEBUG=execa` environment variable in the current process.
    740 
    741 #### nodePath *(For `.node()` only)*
    742 
    743 Type: `string`\
    744 Default: [`process.execPath`](https://nodejs.org/api/process.html#process_process_execpath)
    745 
    746 Node.js executable used to create the child process.
    747 
    748 #### nodeOptions *(For `.node()` only)*
    749 
    750 Type: `string[]`\
    751 Default: [`process.execArgv`](https://nodejs.org/api/process.html#process_process_execargv)
    752 
    753 List of [CLI options](https://nodejs.org/api/cli.html#cli_options) passed to the Node.js executable.
    754 
    755 ## Tips
    756 
    757 ### Retry on error
    758 
    759 Gracefully handle failures by using automatic retries and exponential backoff with the [`p-retry`](https://github.com/sindresorhus/p-retry) package:
    760 
    761 ```js
    762 import pRetry from 'p-retry';
    763 
    764 const run = async () => {
    765 	const results = await execa('curl', ['-sSL', 'https://sindresorhus.com/unicorn']);
    766 	return results;
    767 };
    768 
    769 console.log(await pRetry(run, {retries: 5}));
    770 ```
    771 
    772 ### Cancelling a spawned process
    773 
    774 ```js
    775 import {execa} from 'execa';
    776 
    777 const abortController = new AbortController();
    778 const subprocess = execa('node', [], {signal: abortController.signal});
    779 
    780 setTimeout(() => {
    781 	abortController.abort();
    782 }, 1000);
    783 
    784 try {
    785 	await subprocess;
    786 } catch (error) {
    787 	console.log(subprocess.killed); // true
    788 	console.log(error.isCanceled); // true
    789 }
    790 ```
    791 
    792 ### Execute the current package's binary
    793 
    794 ```js
    795 import {getBinPath} from 'get-bin-path';
    796 
    797 const binPath = await getBinPath();
    798 await execa(binPath);
    799 ```
    800 
    801 `execa` can be combined with [`get-bin-path`](https://github.com/ehmicky/get-bin-path) to test the current package's binary. As opposed to hard-coding the path to the binary, this validates that the `package.json` `bin` field is correctly set up.
    802 
    803 ## Related
    804 
    805 - [gulp-execa](https://github.com/ehmicky/gulp-execa) - Gulp plugin for `execa`
    806 - [nvexeca](https://github.com/ehmicky/nvexeca) - Run `execa` using any Node.js version
    807 - [sudo-prompt](https://github.com/jorangreef/sudo-prompt) - Run commands with elevated privileges.
    808 
    809 ## Maintainers
    810 
    811 - [Sindre Sorhus](https://github.com/sindresorhus)
    812 - [@ehmicky](https://github.com/ehmicky)
    813 
    814 ---
    815 
    816 <div align="center">
    817 	<b>
    818 		<a href="https://tidelift.com/subscription/pkg/npm-execa?utm_source=npm-execa&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
    819 	</b>
    820 	<br>
    821 	<sub>
    822 		Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
    823 	</sub>
    824 </div>