bun-types 1.3.2-canary.20251106T140813 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun.d.ts +102 -6
- package/docs/bundler/bytecode.mdx +465 -0
- package/docs/bundler/css.mdx +1024 -0
- package/docs/bundler/esbuild.mdx +253 -0
- package/docs/bundler/executables.mdx +535 -0
- package/docs/bundler/fullstack.mdx +1064 -0
- package/docs/bundler/hot-reloading.mdx +229 -0
- package/docs/bundler/html-static.mdx +386 -0
- package/docs/bundler/index.mdx +1499 -0
- package/docs/bundler/loaders.mdx +356 -0
- package/docs/bundler/macros.mdx +328 -0
- package/docs/bundler/minifier.mdx +1306 -0
- package/docs/bundler/plugins.mdx +411 -0
- package/docs/feedback.mdx +85 -0
- package/docs/guides/binary/arraybuffer-to-array.mdx +29 -0
- package/docs/guides/binary/arraybuffer-to-blob.mdx +26 -0
- package/docs/guides/binary/arraybuffer-to-buffer.mdx +27 -0
- package/docs/guides/binary/arraybuffer-to-string.mdx +17 -0
- package/docs/guides/binary/arraybuffer-to-typedarray.mdx +41 -0
- package/docs/guides/binary/blob-to-arraybuffer.mdx +16 -0
- package/docs/guides/binary/blob-to-dataview.mdx +16 -0
- package/docs/guides/binary/blob-to-stream.mdx +16 -0
- package/docs/guides/binary/blob-to-string.mdx +17 -0
- package/docs/guides/binary/blob-to-typedarray.mdx +16 -0
- package/docs/guides/binary/buffer-to-arraybuffer.mdx +16 -0
- package/docs/guides/binary/buffer-to-blob.mdx +16 -0
- package/docs/guides/binary/buffer-to-readablestream.mdx +43 -0
- package/docs/guides/binary/buffer-to-string.mdx +27 -0
- package/docs/guides/binary/buffer-to-typedarray.mdx +16 -0
- package/docs/guides/binary/dataview-to-string.mdx +17 -0
- package/docs/guides/binary/typedarray-to-arraybuffer.mdx +27 -0
- package/docs/guides/binary/typedarray-to-blob.mdx +18 -0
- package/docs/guides/binary/typedarray-to-buffer.mdx +16 -0
- package/docs/guides/binary/typedarray-to-dataview.mdx +16 -0
- package/docs/guides/binary/typedarray-to-readablestream.mdx +43 -0
- package/docs/guides/binary/typedarray-to-string.mdx +18 -0
- package/docs/guides/deployment/aws-lambda.mdx +204 -0
- package/docs/guides/deployment/digital-ocean.mdx +161 -0
- package/docs/guides/deployment/google-cloud-run.mdx +197 -0
- package/docs/guides/deployment/railway.mdx +145 -0
- package/docs/guides/deployment/render.mdx +82 -0
- package/docs/guides/deployment/vercel.mdx +99 -0
- package/docs/guides/ecosystem/astro.mdx +82 -0
- package/docs/guides/ecosystem/discordjs.mdx +80 -0
- package/docs/guides/ecosystem/docker.mdx +151 -0
- package/docs/guides/ecosystem/drizzle.mdx +195 -0
- package/docs/guides/ecosystem/edgedb.mdx +257 -0
- package/docs/guides/ecosystem/elysia.mdx +31 -0
- package/docs/guides/ecosystem/express.mdx +43 -0
- package/docs/guides/ecosystem/hono.mdx +47 -0
- package/docs/guides/ecosystem/mongoose.mdx +92 -0
- package/docs/guides/ecosystem/neon-drizzle.mdx +234 -0
- package/docs/guides/ecosystem/neon-serverless-postgres.mdx +60 -0
- package/docs/guides/ecosystem/nextjs.mdx +57 -0
- package/docs/guides/ecosystem/nuxt.mdx +90 -0
- package/docs/guides/ecosystem/pm2.mdx +55 -0
- package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
- package/docs/guides/ecosystem/prisma.mdx +164 -0
- package/docs/guides/ecosystem/qwik.mdx +114 -0
- package/docs/guides/ecosystem/react.mdx +52 -0
- package/docs/guides/ecosystem/remix.mdx +97 -0
- package/docs/guides/ecosystem/sentry.mdx +54 -0
- package/docs/guides/ecosystem/solidstart.mdx +66 -0
- package/docs/guides/ecosystem/ssr-react.mdx +49 -0
- package/docs/guides/ecosystem/stric.mdx +54 -0
- package/docs/guides/ecosystem/sveltekit.mdx +138 -0
- package/docs/guides/ecosystem/systemd.mdx +114 -0
- package/docs/guides/ecosystem/upstash.mdx +87 -0
- package/docs/guides/ecosystem/vite.mdx +77 -0
- package/docs/guides/html-rewriter/extract-links.mdx +72 -0
- package/docs/guides/html-rewriter/extract-social-meta.mdx +97 -0
- package/docs/guides/http/cluster.mdx +69 -0
- package/docs/guides/http/fetch-unix.mdx +35 -0
- package/docs/guides/http/fetch.mdx +26 -0
- package/docs/guides/http/file-uploads.mdx +97 -0
- package/docs/guides/http/hot.mdx +28 -0
- package/docs/guides/http/proxy.mdx +26 -0
- package/docs/guides/http/server.mdx +48 -0
- package/docs/guides/http/simple.mdx +20 -0
- package/docs/guides/http/stream-file.mdx +50 -0
- package/docs/guides/http/stream-iterator.mdx +49 -0
- package/docs/guides/http/stream-node-streams-in-bun.mdx +22 -0
- package/docs/guides/http/tls.mdx +32 -0
- package/docs/guides/index.mdx +10 -0
- package/docs/guides/install/add-dev.mdx +28 -0
- package/docs/guides/install/add-git.mdx +38 -0
- package/docs/guides/install/add-optional.mdx +27 -0
- package/docs/guides/install/add-peer.mdx +45 -0
- package/docs/guides/install/add-tarball.mdx +35 -0
- package/docs/guides/install/add.mdx +44 -0
- package/docs/guides/install/azure-artifacts.mdx +76 -0
- package/docs/guides/install/cicd.mdx +43 -0
- package/docs/guides/install/custom-registry.mdx +32 -0
- package/docs/guides/install/from-npm-install-to-bun-install.mdx +230 -0
- package/docs/guides/install/git-diff-bun-lockfile.mdx +47 -0
- package/docs/guides/install/jfrog-artifactory.mdx +28 -0
- package/docs/guides/install/npm-alias.mdx +25 -0
- package/docs/guides/install/registry-scope.mdx +40 -0
- package/docs/guides/install/trusted.mdx +50 -0
- package/docs/guides/install/workspaces.mdx +70 -0
- package/docs/guides/install/yarnlock.mdx +50 -0
- package/docs/guides/process/argv.mdx +66 -0
- package/docs/guides/process/ctrl-c.mdx +18 -0
- package/docs/guides/process/ipc.mdx +69 -0
- package/docs/guides/process/nanoseconds.mdx +15 -0
- package/docs/guides/process/os-signals.mdx +41 -0
- package/docs/guides/process/spawn-stderr.mdx +34 -0
- package/docs/guides/process/spawn-stdout.mdx +28 -0
- package/docs/guides/process/spawn.mdx +43 -0
- package/docs/guides/process/stdin.mdx +62 -0
- package/docs/guides/read-file/arraybuffer.mdx +30 -0
- package/docs/guides/read-file/buffer.mdx +21 -0
- package/docs/guides/read-file/exists.mdx +18 -0
- package/docs/guides/read-file/json.mdx +19 -0
- package/docs/guides/read-file/mime.mdx +22 -0
- package/docs/guides/read-file/stream.mdx +28 -0
- package/docs/guides/read-file/string.mdx +24 -0
- package/docs/guides/read-file/uint8array.mdx +23 -0
- package/docs/guides/read-file/watch.mdx +66 -0
- package/docs/guides/runtime/build-time-constants.mdx +295 -0
- package/docs/guides/runtime/cicd.mdx +45 -0
- package/docs/guides/runtime/codesign-macos-executable.mdx +61 -0
- package/docs/guides/runtime/define-constant.mdx +149 -0
- package/docs/guides/runtime/delete-directory.mdx +39 -0
- package/docs/guides/runtime/delete-file.mdx +21 -0
- package/docs/guides/runtime/heap-snapshot.mdx +28 -0
- package/docs/guides/runtime/import-html.mdx +17 -0
- package/docs/guides/runtime/import-json.mdx +46 -0
- package/docs/guides/runtime/import-toml.mdx +32 -0
- package/docs/guides/runtime/import-yaml.mdx +104 -0
- package/docs/guides/runtime/read-env.mdx +37 -0
- package/docs/guides/runtime/set-env.mdx +51 -0
- package/docs/guides/runtime/shell.mdx +42 -0
- package/docs/guides/runtime/timezone.mdx +38 -0
- package/docs/guides/runtime/tsconfig-paths.mdx +31 -0
- package/docs/guides/runtime/typescript.mdx +51 -0
- package/docs/guides/runtime/vscode-debugger.mdx +48 -0
- package/docs/guides/runtime/web-debugger.mdx +103 -0
- package/docs/guides/streams/node-readable-to-arraybuffer.mdx +13 -0
- package/docs/guides/streams/node-readable-to-blob.mdx +13 -0
- package/docs/guides/streams/node-readable-to-json.mdx +14 -0
- package/docs/guides/streams/node-readable-to-string.mdx +14 -0
- package/docs/guides/streams/node-readable-to-uint8array.mdx +13 -0
- package/docs/guides/streams/to-array.mdx +16 -0
- package/docs/guides/streams/to-arraybuffer.mdx +16 -0
- package/docs/guides/streams/to-blob.mdx +16 -0
- package/docs/guides/streams/to-buffer.mdx +17 -0
- package/docs/guides/streams/to-json.mdx +16 -0
- package/docs/guides/streams/to-string.mdx +16 -0
- package/docs/guides/streams/to-typedarray.mdx +24 -0
- package/docs/guides/test/bail.mdx +24 -0
- package/docs/guides/test/coverage-threshold.mdx +67 -0
- package/docs/guides/test/coverage.mdx +49 -0
- package/docs/guides/test/happy-dom.mdx +73 -0
- package/docs/guides/test/migrate-from-jest.mdx +125 -0
- package/docs/guides/test/mock-clock.mdx +50 -0
- package/docs/guides/test/mock-functions.mdx +70 -0
- package/docs/guides/test/rerun-each.mdx +16 -0
- package/docs/guides/test/run-tests.mdx +116 -0
- package/docs/guides/test/skip-tests.mdx +43 -0
- package/docs/guides/test/snapshot.mdx +102 -0
- package/docs/guides/test/spy-on.mdx +49 -0
- package/docs/guides/test/svelte-test.mdx +113 -0
- package/docs/guides/test/testing-library.mdx +93 -0
- package/docs/guides/test/timeout.mdx +17 -0
- package/docs/guides/test/todo-tests.mdx +74 -0
- package/docs/guides/test/update-snapshots.mdx +49 -0
- package/docs/guides/test/watch-mode.mdx +24 -0
- package/docs/guides/util/base64.mdx +17 -0
- package/docs/guides/util/deep-equals.mdx +41 -0
- package/docs/guides/util/deflate.mdx +20 -0
- package/docs/guides/util/detect-bun.mdx +25 -0
- package/docs/guides/util/entrypoint.mdx +19 -0
- package/docs/guides/util/escape-html.mdx +24 -0
- package/docs/guides/util/file-url-to-path.mdx +16 -0
- package/docs/guides/util/gzip.mdx +20 -0
- package/docs/guides/util/hash-a-password.mdx +56 -0
- package/docs/guides/util/import-meta-dir.mdx +15 -0
- package/docs/guides/util/import-meta-file.mdx +15 -0
- package/docs/guides/util/import-meta-path.mdx +15 -0
- package/docs/guides/util/javascript-uuid.mdx +25 -0
- package/docs/guides/util/main.mdx +43 -0
- package/docs/guides/util/path-to-file-url.mdx +16 -0
- package/docs/guides/util/sleep.mdx +24 -0
- package/docs/guides/util/version.mdx +23 -0
- package/docs/guides/util/which-path-to-executable-bin.mdx +17 -0
- package/docs/guides/websocket/compression.mdx +33 -0
- package/docs/guides/websocket/context.mdx +74 -0
- package/docs/guides/websocket/pubsub.mdx +40 -0
- package/docs/guides/websocket/simple.mdx +35 -0
- package/docs/guides/write-file/append.mdx +54 -0
- package/docs/guides/write-file/basic.mdx +46 -0
- package/docs/guides/write-file/blob.mdx +30 -0
- package/docs/guides/write-file/cat.mdx +19 -0
- package/docs/guides/write-file/file-cp.mdx +18 -0
- package/docs/guides/write-file/filesink.mdx +54 -0
- package/docs/guides/write-file/response.mdx +19 -0
- package/docs/guides/write-file/stdout.mdx +23 -0
- package/docs/guides/write-file/stream.mdx +19 -0
- package/docs/guides/write-file/unlink.mdx +18 -0
- package/docs/index.mdx +133 -0
- package/docs/installation.mdx +365 -0
- package/docs/pm/bunx.mdx +83 -0
- package/docs/pm/catalogs.mdx +292 -0
- package/docs/pm/cli/add.mdx +179 -0
- package/docs/pm/cli/audit.mdx +60 -0
- package/docs/pm/cli/install.mdx +471 -0
- package/docs/pm/cli/link.mdx +48 -0
- package/docs/pm/cli/outdated.mdx +197 -0
- package/docs/pm/cli/patch.mdx +69 -0
- package/docs/pm/cli/pm.mdx +319 -0
- package/docs/pm/cli/publish.mdx +123 -0
- package/docs/pm/cli/remove.mdx +16 -0
- package/docs/pm/cli/update.mdx +140 -0
- package/docs/pm/cli/why.mdx +84 -0
- package/docs/pm/filter.mdx +102 -0
- package/docs/pm/global-cache.mdx +72 -0
- package/docs/pm/isolated-installs.mdx +205 -0
- package/docs/pm/lifecycle.mdx +57 -0
- package/docs/pm/lockfile.mdx +64 -0
- package/docs/pm/npmrc.mdx +111 -0
- package/docs/pm/overrides.mdx +83 -0
- package/docs/pm/scopes-registries.mdx +35 -0
- package/docs/pm/security-scanner-api.mdx +95 -0
- package/docs/pm/workspaces.mdx +109 -0
- package/docs/project/benchmarking.mdx +218 -0
- package/docs/project/bindgen.mdx +223 -0
- package/docs/project/building-windows.mdx +133 -0
- package/docs/project/contributing.mdx +343 -0
- package/docs/project/feedback.mdx +20 -0
- package/docs/project/license.mdx +78 -0
- package/docs/project/roadmap.mdx +8 -0
- package/docs/quickstart.mdx +240 -0
- package/docs/runtime/auto-install.mdx +97 -0
- package/docs/runtime/binary-data.mdx +846 -0
- package/docs/runtime/bun-apis.mdx +59 -0
- package/docs/runtime/bunfig.mdx +642 -0
- package/docs/runtime/c-compiler.mdx +204 -0
- package/docs/runtime/child-process.mdx +532 -0
- package/docs/runtime/color.mdx +267 -0
- package/docs/runtime/console.mdx +67 -0
- package/docs/runtime/cookies.mdx +454 -0
- package/docs/runtime/debugger.mdx +335 -0
- package/docs/runtime/environment-variables.mdx +214 -0
- package/docs/runtime/ffi.mdx +565 -0
- package/docs/runtime/file-io.mdx +306 -0
- package/docs/runtime/file-system-router.mdx +118 -0
- package/docs/runtime/file-types.mdx +354 -0
- package/docs/runtime/glob.mdx +181 -0
- package/docs/runtime/globals.mdx +72 -0
- package/docs/runtime/hashing.mdx +315 -0
- package/docs/runtime/html-rewriter.mdx +340 -0
- package/docs/runtime/http/cookies.mdx +79 -0
- package/docs/runtime/http/error-handling.mdx +40 -0
- package/docs/runtime/http/metrics.mdx +36 -0
- package/docs/runtime/http/routing.mdx +289 -0
- package/docs/runtime/http/server.mdx +647 -0
- package/docs/runtime/http/tls.mdx +101 -0
- package/docs/runtime/http/websockets.mdx +404 -0
- package/docs/runtime/index.mdx +223 -0
- package/docs/runtime/jsx.mdx +115 -0
- package/docs/runtime/module-resolution.mdx +342 -0
- package/docs/runtime/networking/dns.mdx +111 -0
- package/docs/runtime/networking/fetch.mdx +468 -0
- package/docs/runtime/networking/tcp.mdx +239 -0
- package/docs/runtime/networking/udp.mdx +129 -0
- package/docs/runtime/node-api.mdx +19 -0
- package/docs/runtime/nodejs-compat.mdx +468 -0
- package/docs/runtime/plugins.mdx +405 -0
- package/docs/runtime/redis.mdx +582 -0
- package/docs/runtime/s3.mdx +863 -0
- package/docs/runtime/secrets.mdx +336 -0
- package/docs/runtime/semver.mdx +57 -0
- package/docs/runtime/shell.mdx +637 -0
- package/docs/runtime/sql.mdx +1404 -0
- package/docs/runtime/sqlite.mdx +699 -0
- package/docs/runtime/streams.mdx +232 -0
- package/docs/runtime/templating/create.mdx +269 -0
- package/docs/runtime/templating/init.mdx +58 -0
- package/docs/runtime/transpiler.mdx +288 -0
- package/docs/runtime/typescript.mdx +58 -0
- package/docs/runtime/utils.mdx +922 -0
- package/docs/runtime/watch-mode.mdx +161 -0
- package/docs/runtime/web-apis.mdx +29 -0
- package/docs/runtime/workers.mdx +328 -0
- package/docs/runtime/yaml.mdx +469 -0
- package/docs/snippets/cli/add.mdx +166 -0
- package/docs/snippets/cli/build.mdx +196 -0
- package/docs/snippets/cli/feedback.mdx +17 -0
- package/docs/snippets/cli/init.mdx +84 -0
- package/docs/snippets/cli/install.mdx +173 -0
- package/docs/snippets/cli/link.mdx +163 -0
- package/docs/snippets/cli/outdated.mdx +140 -0
- package/docs/snippets/cli/patch.mdx +171 -0
- package/docs/snippets/cli/publish.mdx +198 -0
- package/docs/snippets/cli/remove.mdx +146 -0
- package/docs/snippets/cli/run.mdx +293 -0
- package/docs/snippets/cli/test.mdx +100 -0
- package/docs/snippets/cli/update.mdx +144 -0
- package/docs/snippets/product-card.mdx +32 -0
- package/docs/snippets/product-tiles.mdx +94 -0
- package/docs/test/code-coverage.mdx +409 -0
- package/docs/test/configuration.mdx +467 -0
- package/docs/test/dates-times.mdx +129 -0
- package/docs/test/discovery.mdx +90 -0
- package/docs/test/dom.mdx +226 -0
- package/docs/test/index.mdx +380 -0
- package/docs/test/lifecycle.mdx +348 -0
- package/docs/test/mocks.mdx +637 -0
- package/docs/test/reporters.mdx +117 -0
- package/docs/test/runtime-behavior.mdx +342 -0
- package/docs/test/snapshots.mdx +434 -0
- package/docs/test/writing-tests.mdx +635 -0
- package/docs/typescript.mdx +54 -0
- package/package.json +8 -6
- package/test.d.ts +2 -2
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Shell
|
|
3
|
+
description: Use Bun's shell scripting API to run shell commands from JavaScript
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Bun Shell makes shell scripting with JavaScript & TypeScript fun. It's a cross-platform bash-like shell with seamless JavaScript interop.
|
|
7
|
+
|
|
8
|
+
Quickstart:
|
|
9
|
+
|
|
10
|
+
```ts index.ts icon="/icons/typescript.svg"
|
|
11
|
+
import { $ } from "bun";
|
|
12
|
+
|
|
13
|
+
const response = await fetch("https://example.com");
|
|
14
|
+
|
|
15
|
+
// Use Response as stdin.
|
|
16
|
+
await $`cat < ${response} | wc -c`; // 1256
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Features
|
|
22
|
+
|
|
23
|
+
- **Cross-platform**: works on Windows, Linux & macOS. Instead of `rimraf` or `cross-env`', you can use Bun Shell without installing extra dependencies. Common shell commands like `ls`, `cd`, `rm` are implemented natively.
|
|
24
|
+
- **Familiar**: Bun Shell is a bash-like shell, supporting redirection, pipes, environment variables and more.
|
|
25
|
+
- **Globs**: Glob patterns are supported natively, including `**`, `*`, `{expansion}`, and more.
|
|
26
|
+
- **Template literals**: Template literals are used to execute shell commands. This allows for easy interpolation of variables and expressions.
|
|
27
|
+
- **Safety**: Bun Shell escapes all strings by default, preventing shell injection attacks.
|
|
28
|
+
- **JavaScript interop**: Use `Response`, `ArrayBuffer`, `Blob`, `Bun.file(path)` and other JavaScript objects as stdin, stdout, and stderr.
|
|
29
|
+
- **Shell scripting**: Bun Shell can be used to run shell scripts (`.bun.sh` files).
|
|
30
|
+
- **Custom interpreter**: Bun Shell is written in Zig, along with its lexer, parser, and interpreter. Bun Shell is a small programming language.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Getting started
|
|
35
|
+
|
|
36
|
+
The simplest shell command is `echo`. To run it, use the `$` template literal tag:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
import { $ } from "bun";
|
|
40
|
+
|
|
41
|
+
await $`echo "Hello World!"`; // Hello World!
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
By default, shell commands print to stdout. To quiet the output, call `.quiet()`:
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
import { $ } from "bun";
|
|
48
|
+
|
|
49
|
+
await $`echo "Hello World!"`.quiet(); // No output
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
What if you want to access the output of the command as text? Use `.text()`:
|
|
53
|
+
|
|
54
|
+
```js
|
|
55
|
+
import { $ } from "bun";
|
|
56
|
+
|
|
57
|
+
// .text() automatically calls .quiet() for you
|
|
58
|
+
const welcome = await $`echo "Hello World!"`.text();
|
|
59
|
+
|
|
60
|
+
console.log(welcome); // Hello World!\n
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
By default, `await`ing will return stdout and stderr as `Buffer`s.
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
import { $ } from "bun";
|
|
67
|
+
|
|
68
|
+
const { stdout, stderr } = await $`echo "Hello!"`.quiet();
|
|
69
|
+
|
|
70
|
+
console.log(stdout); // Buffer(7) [ 72, 101, 108, 108, 111, 33, 10 ]
|
|
71
|
+
console.log(stderr); // Buffer(0) []
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Error handling
|
|
77
|
+
|
|
78
|
+
By default, non-zero exit codes will throw an error. This `ShellError` contains information about the command run.
|
|
79
|
+
|
|
80
|
+
```js
|
|
81
|
+
import { $ } from "bun";
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
const output = await $`something-that-may-fail`.text();
|
|
85
|
+
console.log(output);
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.log(`Failed with code ${err.exitCode}`);
|
|
88
|
+
console.log(err.stdout.toString());
|
|
89
|
+
console.log(err.stderr.toString());
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Throwing can be disabled with `.nothrow()`. The result's `exitCode` will need to be checked manually.
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
import { $ } from "bun";
|
|
97
|
+
|
|
98
|
+
const { stdout, stderr, exitCode } = await $`something-that-may-fail`.nothrow().quiet();
|
|
99
|
+
|
|
100
|
+
if (exitCode !== 0) {
|
|
101
|
+
console.log(`Non-zero exit code ${exitCode}`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
console.log(stdout);
|
|
105
|
+
console.log(stderr);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
The default handling of non-zero exit codes can be configured by calling `.nothrow()` or `.throws(boolean)` on the `$` function itself.
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
import { $ } from "bun";
|
|
112
|
+
// shell promises will not throw, meaning you will have to
|
|
113
|
+
// check for `exitCode` manually on every shell command.
|
|
114
|
+
$.nothrow(); // equivalent to $.throws(false)
|
|
115
|
+
|
|
116
|
+
// default behavior, non-zero exit codes will throw an error
|
|
117
|
+
$.throws(true);
|
|
118
|
+
|
|
119
|
+
// alias for $.nothrow()
|
|
120
|
+
$.throws(false);
|
|
121
|
+
|
|
122
|
+
await $`something-that-may-fail`; // No exception thrown
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Redirection
|
|
128
|
+
|
|
129
|
+
A command's _input_ or _output_ may be _redirected_ using the typical Bash operators:
|
|
130
|
+
|
|
131
|
+
- `<` redirect stdin
|
|
132
|
+
- `>` or `1>` redirect stdout
|
|
133
|
+
- `2>` redirect stderr
|
|
134
|
+
- `&>` redirect both stdout and stderr
|
|
135
|
+
- `>>` or `1>>` redirect stdout, _appending_ to the destination, instead of overwriting
|
|
136
|
+
- `2>>` redirect stderr, _appending_ to the destination, instead of overwriting
|
|
137
|
+
- `&>>` redirect both stdout and stderr, _appending_ to the destination, instead of overwriting
|
|
138
|
+
- `1>&2` redirect stdout to stderr (all writes to stdout will instead be in stderr)
|
|
139
|
+
- `2>&1` redirect stderr to stdout (all writes to stderr will instead be in stdout)
|
|
140
|
+
|
|
141
|
+
Bun Shell also supports redirecting from and to JavaScript objects.
|
|
142
|
+
|
|
143
|
+
### Example: Redirect output to JavaScript objects (`>`)
|
|
144
|
+
|
|
145
|
+
To redirect stdout to a JavaScript object, use the `>` operator:
|
|
146
|
+
|
|
147
|
+
```js
|
|
148
|
+
import { $ } from "bun";
|
|
149
|
+
|
|
150
|
+
const buffer = Buffer.alloc(100);
|
|
151
|
+
await $`echo "Hello World!" > ${buffer}`;
|
|
152
|
+
|
|
153
|
+
console.log(buffer.toString()); // Hello World!\n
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The following JavaScript objects are supported for redirection to:
|
|
157
|
+
|
|
158
|
+
- `Buffer`, `Uint8Array`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `ArrayBuffer`, `SharedArrayBuffer` (writes to the underlying buffer)
|
|
159
|
+
- `Bun.file(path)`, `Bun.file(fd)` (writes to the file)
|
|
160
|
+
|
|
161
|
+
### Example: Redirect input from JavaScript objects (`<`)
|
|
162
|
+
|
|
163
|
+
To redirect the output from JavaScript objects to stdin, use the `<` operator:
|
|
164
|
+
|
|
165
|
+
```js
|
|
166
|
+
import { $ } from "bun";
|
|
167
|
+
|
|
168
|
+
const response = new Response("hello i am a response body");
|
|
169
|
+
|
|
170
|
+
const result = await $`cat < ${response}`.text();
|
|
171
|
+
|
|
172
|
+
console.log(result); // hello i am a response body
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The following JavaScript objects are supported for redirection from:
|
|
176
|
+
|
|
177
|
+
- `Buffer`, `Uint8Array`, `Uint16Array`, `Uint32Array`, `Int8Array`, `Int16Array`, `Int32Array`, `Float32Array`, `Float64Array`, `ArrayBuffer`, `SharedArrayBuffer` (reads from the underlying buffer)
|
|
178
|
+
- `Bun.file(path)`, `Bun.file(fd)` (reads from the file)
|
|
179
|
+
- `Response` (reads from the body)
|
|
180
|
+
|
|
181
|
+
### Example: Redirect stdin -> file
|
|
182
|
+
|
|
183
|
+
```js
|
|
184
|
+
import { $ } from "bun";
|
|
185
|
+
|
|
186
|
+
await $`cat < myfile.txt`;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Example: Redirect stdout -> file
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
import { $ } from "bun";
|
|
193
|
+
|
|
194
|
+
await $`echo bun! > greeting.txt`;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Example: Redirect stderr -> file
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
import { $ } from "bun";
|
|
201
|
+
|
|
202
|
+
await $`bun run index.ts 2> errors.txt`;
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Example: Redirect stderr -> stdout
|
|
206
|
+
|
|
207
|
+
```js
|
|
208
|
+
import { $ } from "bun";
|
|
209
|
+
|
|
210
|
+
// redirects stderr to stdout, so all output
|
|
211
|
+
// will be available on stdout
|
|
212
|
+
await $`bun run ./index.ts 2>&1`;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Example: Redirect stdout -> stderr
|
|
216
|
+
|
|
217
|
+
```js
|
|
218
|
+
import { $ } from "bun";
|
|
219
|
+
|
|
220
|
+
// redirects stdout to stderr, so all output
|
|
221
|
+
// will be available on stderr
|
|
222
|
+
await $`bun run ./index.ts 1>&2`;
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Piping (`|`)
|
|
226
|
+
|
|
227
|
+
Like in bash, you can pipe the output of one command to another:
|
|
228
|
+
|
|
229
|
+
```js
|
|
230
|
+
import { $ } from "bun";
|
|
231
|
+
|
|
232
|
+
const result = await $`echo "Hello World!" | wc -w`.text();
|
|
233
|
+
|
|
234
|
+
console.log(result); // 2\n
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
You can also pipe with JavaScript objects:
|
|
238
|
+
|
|
239
|
+
```js
|
|
240
|
+
import { $ } from "bun";
|
|
241
|
+
|
|
242
|
+
const response = new Response("hello i am a response body");
|
|
243
|
+
|
|
244
|
+
const result = await $`cat < ${response} | wc -w`.text();
|
|
245
|
+
|
|
246
|
+
console.log(result); // 6\n
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## Command substitution (`$(...)`)
|
|
250
|
+
|
|
251
|
+
Command substitution allows you to substitute the output of another script into the current script:
|
|
252
|
+
|
|
253
|
+
```js
|
|
254
|
+
import { $ } from "bun";
|
|
255
|
+
|
|
256
|
+
// Prints out the hash of the current commit
|
|
257
|
+
await $`echo Hash of current commit: $(git rev-parse HEAD)`;
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
This is a textual insertion of the command's output and can be used to, for example, declare a shell variable:
|
|
261
|
+
|
|
262
|
+
```js
|
|
263
|
+
import { $ } from "bun";
|
|
264
|
+
|
|
265
|
+
await $`
|
|
266
|
+
REV=$(git rev-parse HEAD)
|
|
267
|
+
docker built -t myapp:$REV
|
|
268
|
+
echo Done building docker image "myapp:$REV"
|
|
269
|
+
`;
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
<Note>
|
|
273
|
+
|
|
274
|
+
Because Bun internally uses the special [`raw`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#raw_strings) property on the input template literal, using the backtick syntax for command substitution won't work:
|
|
275
|
+
|
|
276
|
+
```ts icon="file-code"
|
|
277
|
+
import { $ } from "bun";
|
|
278
|
+
|
|
279
|
+
await $`echo \`echo hi\``;
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
Instead of printing:
|
|
283
|
+
|
|
284
|
+
```
|
|
285
|
+
hi
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The above will print out:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
echo hi
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
We instead recommend sticking to the `$(...)` syntax.
|
|
295
|
+
|
|
296
|
+
</Note>
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Environment variables
|
|
301
|
+
|
|
302
|
+
Environment variables can be set like in bash:
|
|
303
|
+
|
|
304
|
+
```js
|
|
305
|
+
import { $ } from "bun";
|
|
306
|
+
|
|
307
|
+
await $`FOO=foo bun -e 'console.log(process.env.FOO)'`; // foo\n
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
You can use string interpolation to set environment variables:
|
|
311
|
+
|
|
312
|
+
```js
|
|
313
|
+
import { $ } from "bun";
|
|
314
|
+
|
|
315
|
+
const foo = "bar123";
|
|
316
|
+
|
|
317
|
+
await $`FOO=${foo + "456"} bun -e 'console.log(process.env.FOO)'`; // bar123456\n
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
Input is escaped by default, preventing shell injection attacks:
|
|
321
|
+
|
|
322
|
+
```js
|
|
323
|
+
import { $ } from "bun";
|
|
324
|
+
|
|
325
|
+
const foo = "bar123; rm -rf /tmp";
|
|
326
|
+
|
|
327
|
+
await $`FOO=${foo} bun -e 'console.log(process.env.FOO)'`; // bar123; rm -rf /tmp\n
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Changing the environment variables
|
|
331
|
+
|
|
332
|
+
By default, `process.env` is used as the environment variables for all commands.
|
|
333
|
+
|
|
334
|
+
You can change the environment variables for a single command by calling `.env()`:
|
|
335
|
+
|
|
336
|
+
```js
|
|
337
|
+
import { $ } from "bun";
|
|
338
|
+
|
|
339
|
+
await $`echo $FOO`.env({ ...process.env, FOO: "bar" }); // bar
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
You can change the default environment variables for all commands by calling `$.env`:
|
|
343
|
+
|
|
344
|
+
```js
|
|
345
|
+
import { $ } from "bun";
|
|
346
|
+
|
|
347
|
+
$.env({ FOO: "bar" });
|
|
348
|
+
|
|
349
|
+
// the globally-set $FOO
|
|
350
|
+
await $`echo $FOO`; // bar
|
|
351
|
+
|
|
352
|
+
// the locally-set $FOO
|
|
353
|
+
await $`echo $FOO`.env({ FOO: "baz" }); // baz
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
You can reset the environment variables to the default by calling `$.env()` with no arguments:
|
|
357
|
+
|
|
358
|
+
```js
|
|
359
|
+
import { $ } from "bun";
|
|
360
|
+
|
|
361
|
+
$.env({ FOO: "bar" });
|
|
362
|
+
|
|
363
|
+
// the globally-set $FOO
|
|
364
|
+
await $`echo $FOO`; // bar
|
|
365
|
+
|
|
366
|
+
// the locally-set $FOO
|
|
367
|
+
await $`echo $FOO`.env(undefined); // ""
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Changing the working directory
|
|
371
|
+
|
|
372
|
+
You can change the working directory of a command by passing a string to `.cwd()`:
|
|
373
|
+
|
|
374
|
+
```js
|
|
375
|
+
import { $ } from "bun";
|
|
376
|
+
|
|
377
|
+
await $`pwd`.cwd("/tmp"); // /tmp
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
You can change the default working directory for all commands by calling `$.cwd`:
|
|
381
|
+
|
|
382
|
+
```js
|
|
383
|
+
import { $ } from "bun";
|
|
384
|
+
|
|
385
|
+
$.cwd("/tmp");
|
|
386
|
+
|
|
387
|
+
// the globally-set working directory
|
|
388
|
+
await $`pwd`; // /tmp
|
|
389
|
+
|
|
390
|
+
// the locally-set working directory
|
|
391
|
+
await $`pwd`.cwd("/"); // /
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Reading output
|
|
397
|
+
|
|
398
|
+
To read the output of a command as a string, use `.text()`:
|
|
399
|
+
|
|
400
|
+
```js
|
|
401
|
+
import { $ } from "bun";
|
|
402
|
+
|
|
403
|
+
const result = await $`echo "Hello World!"`.text();
|
|
404
|
+
|
|
405
|
+
console.log(result); // Hello World!\n
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Reading output as JSON
|
|
409
|
+
|
|
410
|
+
To read the output of a command as JSON, use `.json()`:
|
|
411
|
+
|
|
412
|
+
```js
|
|
413
|
+
import { $ } from "bun";
|
|
414
|
+
|
|
415
|
+
const result = await $`echo '{"foo": "bar"}'`.json();
|
|
416
|
+
|
|
417
|
+
console.log(result); // { foo: "bar" }
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### Reading output line-by-line
|
|
421
|
+
|
|
422
|
+
To read the output of a command line-by-line, use `.lines()`:
|
|
423
|
+
|
|
424
|
+
```js
|
|
425
|
+
import { $ } from "bun";
|
|
426
|
+
|
|
427
|
+
for await (let line of $`echo "Hello World!"`.lines()) {
|
|
428
|
+
console.log(line); // Hello World!
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
You can also use `.lines()` on a completed command:
|
|
433
|
+
|
|
434
|
+
```js
|
|
435
|
+
import { $ } from "bun";
|
|
436
|
+
|
|
437
|
+
const search = "bun";
|
|
438
|
+
|
|
439
|
+
for await (let line of $`cat list.txt | grep ${search}`.lines()) {
|
|
440
|
+
console.log(line);
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### Reading output as a Blob
|
|
445
|
+
|
|
446
|
+
To read the output of a command as a Blob, use `.blob()`:
|
|
447
|
+
|
|
448
|
+
```js
|
|
449
|
+
import { $ } from "bun";
|
|
450
|
+
|
|
451
|
+
const result = await $`echo "Hello World!"`.blob();
|
|
452
|
+
|
|
453
|
+
console.log(result); // Blob(13) { size: 13, type: "text/plain" }
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## Builtin Commands
|
|
459
|
+
|
|
460
|
+
For cross-platform compatibility, Bun Shell implements a set of builtin commands, in addition to reading commands from the PATH environment variable.
|
|
461
|
+
|
|
462
|
+
- `cd`: change the working directory
|
|
463
|
+
- `ls`: list files in a directory
|
|
464
|
+
- `rm`: remove files and directories
|
|
465
|
+
- `echo`: print text
|
|
466
|
+
- `pwd`: print the working directory
|
|
467
|
+
- `bun`: run bun in bun
|
|
468
|
+
- `cat`
|
|
469
|
+
- `touch`
|
|
470
|
+
- `mkdir`
|
|
471
|
+
- `which`
|
|
472
|
+
- `mv`
|
|
473
|
+
- `exit`
|
|
474
|
+
- `true`
|
|
475
|
+
- `false`
|
|
476
|
+
- `yes`
|
|
477
|
+
- `seq`
|
|
478
|
+
- `dirname`
|
|
479
|
+
- `basename`
|
|
480
|
+
|
|
481
|
+
**Partially** implemented:
|
|
482
|
+
|
|
483
|
+
- `mv`: move files and directories (missing cross-device support)
|
|
484
|
+
|
|
485
|
+
**Not** implemented yet, but planned:
|
|
486
|
+
|
|
487
|
+
- See [Issue #9716](https://github.com/oven-sh/bun/issues/9716) for the full list.
|
|
488
|
+
|
|
489
|
+
---
|
|
490
|
+
|
|
491
|
+
## Utilities
|
|
492
|
+
|
|
493
|
+
Bun Shell also implements a set of utilities for working with shells.
|
|
494
|
+
|
|
495
|
+
### `$.braces` (brace expansion)
|
|
496
|
+
|
|
497
|
+
This function implements simple [brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html) for shell commands:
|
|
498
|
+
|
|
499
|
+
```js
|
|
500
|
+
import { $ } from "bun";
|
|
501
|
+
|
|
502
|
+
await $.braces(`echo {1,2,3}`);
|
|
503
|
+
// => ["echo 1", "echo 2", "echo 3"]
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### `$.escape` (escape strings)
|
|
507
|
+
|
|
508
|
+
Exposes Bun Shell's escaping logic as a function:
|
|
509
|
+
|
|
510
|
+
```js
|
|
511
|
+
import { $ } from "bun";
|
|
512
|
+
|
|
513
|
+
console.log($.escape('$(foo) `bar` "baz"'));
|
|
514
|
+
// => \$(foo) \`bar\` \"baz\"
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
If you do not want your string to be escaped, wrap it in a `{ raw: 'str' }` object:
|
|
518
|
+
|
|
519
|
+
```js
|
|
520
|
+
import { $ } from "bun";
|
|
521
|
+
|
|
522
|
+
await $`echo ${{ raw: '$(foo) `bar` "baz"' }}`;
|
|
523
|
+
// => bun: command not found: foo
|
|
524
|
+
// => bun: command not found: bar
|
|
525
|
+
// => baz
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
---
|
|
529
|
+
|
|
530
|
+
## `.sh` file loader
|
|
531
|
+
|
|
532
|
+
For simple shell scripts, instead of `/bin/sh`, you can use Bun Shell to run shell scripts.
|
|
533
|
+
|
|
534
|
+
To do so, just run the script with `bun` on a file with the `.sh` extension.
|
|
535
|
+
|
|
536
|
+
```sh script.sh icon="file-code"
|
|
537
|
+
echo "Hello World! pwd=$(pwd)"
|
|
538
|
+
```
|
|
539
|
+
|
|
540
|
+
```sh terminal icon="terminal"
|
|
541
|
+
bun ./script.sh
|
|
542
|
+
```
|
|
543
|
+
|
|
544
|
+
```txt
|
|
545
|
+
Hello World! pwd=/home/demo
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
Scripts with Bun Shell are cross platform, which means they work on Windows:
|
|
549
|
+
|
|
550
|
+
```powershell powershell icon="windows"
|
|
551
|
+
bun .\script.sh
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
```txt
|
|
555
|
+
Hello World! pwd=C:\Users\Demo
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
---
|
|
559
|
+
|
|
560
|
+
## Implementation notes
|
|
561
|
+
|
|
562
|
+
Bun Shell is a small programming language in Bun that is implemented in Zig. It includes a handwritten lexer, parser, and interpreter. Unlike bash, zsh, and other shells, Bun Shell runs operations concurrently.
|
|
563
|
+
|
|
564
|
+
---
|
|
565
|
+
|
|
566
|
+
## Security in the Bun shell
|
|
567
|
+
|
|
568
|
+
By design, the Bun shell _does not invoke a system shell_ (like `/bin/sh`) and
|
|
569
|
+
is instead a re-implementation of bash that runs in the same Bun process,
|
|
570
|
+
designed with security in mind.
|
|
571
|
+
|
|
572
|
+
When parsing command arguments, it treats all _interpolated variables_ as single, literal strings.
|
|
573
|
+
|
|
574
|
+
This protects the Bun shell against **command injection**:
|
|
575
|
+
|
|
576
|
+
```js
|
|
577
|
+
import { $ } from "bun";
|
|
578
|
+
|
|
579
|
+
const userInput = "my-file.txt; rm -rf /";
|
|
580
|
+
|
|
581
|
+
// SAFE: `userInput` is treated as a single quoted string
|
|
582
|
+
await $`ls ${userInput}`;
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
In the above example, `userInput` is treated as a single string. This causes
|
|
586
|
+
the `ls` command to try to read the contents of a single directory named
|
|
587
|
+
"my-file; rm -rf /".
|
|
588
|
+
|
|
589
|
+
### Security considerations
|
|
590
|
+
|
|
591
|
+
While command injection is prevented by default, developers are still
|
|
592
|
+
responsible for security in certain scenarios.
|
|
593
|
+
|
|
594
|
+
Similar to the `Bun.spawn` or `node:child_process.exec()` APIs, you can intentionally
|
|
595
|
+
execute a command which spawns a new shell (e.g. `bash -c`) with arguments.
|
|
596
|
+
|
|
597
|
+
When you do this, you hand off control, and Bun's built-in protections no
|
|
598
|
+
longer apply to the string interpreted by that new shell.
|
|
599
|
+
|
|
600
|
+
```js
|
|
601
|
+
import { $ } from "bun";
|
|
602
|
+
|
|
603
|
+
const userInput = "world; touch /tmp/pwned";
|
|
604
|
+
|
|
605
|
+
// UNSAFE: You have explicitly started a new shell process with `bash -c`.
|
|
606
|
+
// This new shell will execute the `touch` command. Any user input
|
|
607
|
+
// passed this way must be rigorously sanitized.
|
|
608
|
+
await $`bash -c "echo ${userInput}"`;
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
### Argument injection
|
|
612
|
+
|
|
613
|
+
The Bun shell cannot know how an external command interprets its own
|
|
614
|
+
command-line arguments. An attacker can supply input that the target program
|
|
615
|
+
recognizes as one of its own options or flags, leading to unintended behavior.
|
|
616
|
+
|
|
617
|
+
```js
|
|
618
|
+
import { $ } from "bun";
|
|
619
|
+
|
|
620
|
+
// Malicious input formatted as a Git command-line flag
|
|
621
|
+
const branch = "--upload-pack=echo pwned";
|
|
622
|
+
|
|
623
|
+
// UNSAFE: While Bun safely passes the string as a single argument,
|
|
624
|
+
// the `git` program itself sees and acts upon the malicious flag.
|
|
625
|
+
await $`git ls-remote origin ${branch}`;
|
|
626
|
+
```
|
|
627
|
+
|
|
628
|
+
<Note>
|
|
629
|
+
**Recommendation** — As is best practice in every language, always sanitize user-provided input before passing it as
|
|
630
|
+
an argument to an external command. The responsibility for validating arguments rests with your application code.
|
|
631
|
+
</Note>
|
|
632
|
+
|
|
633
|
+
---
|
|
634
|
+
|
|
635
|
+
## Credits
|
|
636
|
+
|
|
637
|
+
Large parts of this API were inspired by [zx](https://github.com/google/zx), [dax](https://github.com/dsherret/dax), and [bnx](https://github.com/wobsoriano/bnx). Thank you to the authors of those projects.
|