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.
Files changed (316) hide show
  1. package/bun.d.ts +102 -6
  2. package/docs/bundler/bytecode.mdx +465 -0
  3. package/docs/bundler/css.mdx +1024 -0
  4. package/docs/bundler/esbuild.mdx +253 -0
  5. package/docs/bundler/executables.mdx +535 -0
  6. package/docs/bundler/fullstack.mdx +1064 -0
  7. package/docs/bundler/hot-reloading.mdx +229 -0
  8. package/docs/bundler/html-static.mdx +386 -0
  9. package/docs/bundler/index.mdx +1499 -0
  10. package/docs/bundler/loaders.mdx +356 -0
  11. package/docs/bundler/macros.mdx +328 -0
  12. package/docs/bundler/minifier.mdx +1306 -0
  13. package/docs/bundler/plugins.mdx +411 -0
  14. package/docs/feedback.mdx +85 -0
  15. package/docs/guides/binary/arraybuffer-to-array.mdx +29 -0
  16. package/docs/guides/binary/arraybuffer-to-blob.mdx +26 -0
  17. package/docs/guides/binary/arraybuffer-to-buffer.mdx +27 -0
  18. package/docs/guides/binary/arraybuffer-to-string.mdx +17 -0
  19. package/docs/guides/binary/arraybuffer-to-typedarray.mdx +41 -0
  20. package/docs/guides/binary/blob-to-arraybuffer.mdx +16 -0
  21. package/docs/guides/binary/blob-to-dataview.mdx +16 -0
  22. package/docs/guides/binary/blob-to-stream.mdx +16 -0
  23. package/docs/guides/binary/blob-to-string.mdx +17 -0
  24. package/docs/guides/binary/blob-to-typedarray.mdx +16 -0
  25. package/docs/guides/binary/buffer-to-arraybuffer.mdx +16 -0
  26. package/docs/guides/binary/buffer-to-blob.mdx +16 -0
  27. package/docs/guides/binary/buffer-to-readablestream.mdx +43 -0
  28. package/docs/guides/binary/buffer-to-string.mdx +27 -0
  29. package/docs/guides/binary/buffer-to-typedarray.mdx +16 -0
  30. package/docs/guides/binary/dataview-to-string.mdx +17 -0
  31. package/docs/guides/binary/typedarray-to-arraybuffer.mdx +27 -0
  32. package/docs/guides/binary/typedarray-to-blob.mdx +18 -0
  33. package/docs/guides/binary/typedarray-to-buffer.mdx +16 -0
  34. package/docs/guides/binary/typedarray-to-dataview.mdx +16 -0
  35. package/docs/guides/binary/typedarray-to-readablestream.mdx +43 -0
  36. package/docs/guides/binary/typedarray-to-string.mdx +18 -0
  37. package/docs/guides/deployment/aws-lambda.mdx +204 -0
  38. package/docs/guides/deployment/digital-ocean.mdx +161 -0
  39. package/docs/guides/deployment/google-cloud-run.mdx +197 -0
  40. package/docs/guides/deployment/railway.mdx +145 -0
  41. package/docs/guides/deployment/render.mdx +82 -0
  42. package/docs/guides/deployment/vercel.mdx +99 -0
  43. package/docs/guides/ecosystem/astro.mdx +82 -0
  44. package/docs/guides/ecosystem/discordjs.mdx +80 -0
  45. package/docs/guides/ecosystem/docker.mdx +151 -0
  46. package/docs/guides/ecosystem/drizzle.mdx +195 -0
  47. package/docs/guides/ecosystem/edgedb.mdx +257 -0
  48. package/docs/guides/ecosystem/elysia.mdx +31 -0
  49. package/docs/guides/ecosystem/express.mdx +43 -0
  50. package/docs/guides/ecosystem/hono.mdx +47 -0
  51. package/docs/guides/ecosystem/mongoose.mdx +92 -0
  52. package/docs/guides/ecosystem/neon-drizzle.mdx +234 -0
  53. package/docs/guides/ecosystem/neon-serverless-postgres.mdx +60 -0
  54. package/docs/guides/ecosystem/nextjs.mdx +57 -0
  55. package/docs/guides/ecosystem/nuxt.mdx +90 -0
  56. package/docs/guides/ecosystem/pm2.mdx +55 -0
  57. package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
  58. package/docs/guides/ecosystem/prisma.mdx +164 -0
  59. package/docs/guides/ecosystem/qwik.mdx +114 -0
  60. package/docs/guides/ecosystem/react.mdx +52 -0
  61. package/docs/guides/ecosystem/remix.mdx +97 -0
  62. package/docs/guides/ecosystem/sentry.mdx +54 -0
  63. package/docs/guides/ecosystem/solidstart.mdx +66 -0
  64. package/docs/guides/ecosystem/ssr-react.mdx +49 -0
  65. package/docs/guides/ecosystem/stric.mdx +54 -0
  66. package/docs/guides/ecosystem/sveltekit.mdx +138 -0
  67. package/docs/guides/ecosystem/systemd.mdx +114 -0
  68. package/docs/guides/ecosystem/upstash.mdx +87 -0
  69. package/docs/guides/ecosystem/vite.mdx +77 -0
  70. package/docs/guides/html-rewriter/extract-links.mdx +72 -0
  71. package/docs/guides/html-rewriter/extract-social-meta.mdx +97 -0
  72. package/docs/guides/http/cluster.mdx +69 -0
  73. package/docs/guides/http/fetch-unix.mdx +35 -0
  74. package/docs/guides/http/fetch.mdx +26 -0
  75. package/docs/guides/http/file-uploads.mdx +97 -0
  76. package/docs/guides/http/hot.mdx +28 -0
  77. package/docs/guides/http/proxy.mdx +26 -0
  78. package/docs/guides/http/server.mdx +48 -0
  79. package/docs/guides/http/simple.mdx +20 -0
  80. package/docs/guides/http/stream-file.mdx +50 -0
  81. package/docs/guides/http/stream-iterator.mdx +49 -0
  82. package/docs/guides/http/stream-node-streams-in-bun.mdx +22 -0
  83. package/docs/guides/http/tls.mdx +32 -0
  84. package/docs/guides/index.mdx +10 -0
  85. package/docs/guides/install/add-dev.mdx +28 -0
  86. package/docs/guides/install/add-git.mdx +38 -0
  87. package/docs/guides/install/add-optional.mdx +27 -0
  88. package/docs/guides/install/add-peer.mdx +45 -0
  89. package/docs/guides/install/add-tarball.mdx +35 -0
  90. package/docs/guides/install/add.mdx +44 -0
  91. package/docs/guides/install/azure-artifacts.mdx +76 -0
  92. package/docs/guides/install/cicd.mdx +43 -0
  93. package/docs/guides/install/custom-registry.mdx +32 -0
  94. package/docs/guides/install/from-npm-install-to-bun-install.mdx +230 -0
  95. package/docs/guides/install/git-diff-bun-lockfile.mdx +47 -0
  96. package/docs/guides/install/jfrog-artifactory.mdx +28 -0
  97. package/docs/guides/install/npm-alias.mdx +25 -0
  98. package/docs/guides/install/registry-scope.mdx +40 -0
  99. package/docs/guides/install/trusted.mdx +50 -0
  100. package/docs/guides/install/workspaces.mdx +70 -0
  101. package/docs/guides/install/yarnlock.mdx +50 -0
  102. package/docs/guides/process/argv.mdx +66 -0
  103. package/docs/guides/process/ctrl-c.mdx +18 -0
  104. package/docs/guides/process/ipc.mdx +69 -0
  105. package/docs/guides/process/nanoseconds.mdx +15 -0
  106. package/docs/guides/process/os-signals.mdx +41 -0
  107. package/docs/guides/process/spawn-stderr.mdx +34 -0
  108. package/docs/guides/process/spawn-stdout.mdx +28 -0
  109. package/docs/guides/process/spawn.mdx +43 -0
  110. package/docs/guides/process/stdin.mdx +62 -0
  111. package/docs/guides/read-file/arraybuffer.mdx +30 -0
  112. package/docs/guides/read-file/buffer.mdx +21 -0
  113. package/docs/guides/read-file/exists.mdx +18 -0
  114. package/docs/guides/read-file/json.mdx +19 -0
  115. package/docs/guides/read-file/mime.mdx +22 -0
  116. package/docs/guides/read-file/stream.mdx +28 -0
  117. package/docs/guides/read-file/string.mdx +24 -0
  118. package/docs/guides/read-file/uint8array.mdx +23 -0
  119. package/docs/guides/read-file/watch.mdx +66 -0
  120. package/docs/guides/runtime/build-time-constants.mdx +295 -0
  121. package/docs/guides/runtime/cicd.mdx +45 -0
  122. package/docs/guides/runtime/codesign-macos-executable.mdx +61 -0
  123. package/docs/guides/runtime/define-constant.mdx +149 -0
  124. package/docs/guides/runtime/delete-directory.mdx +39 -0
  125. package/docs/guides/runtime/delete-file.mdx +21 -0
  126. package/docs/guides/runtime/heap-snapshot.mdx +28 -0
  127. package/docs/guides/runtime/import-html.mdx +17 -0
  128. package/docs/guides/runtime/import-json.mdx +46 -0
  129. package/docs/guides/runtime/import-toml.mdx +32 -0
  130. package/docs/guides/runtime/import-yaml.mdx +104 -0
  131. package/docs/guides/runtime/read-env.mdx +37 -0
  132. package/docs/guides/runtime/set-env.mdx +51 -0
  133. package/docs/guides/runtime/shell.mdx +42 -0
  134. package/docs/guides/runtime/timezone.mdx +38 -0
  135. package/docs/guides/runtime/tsconfig-paths.mdx +31 -0
  136. package/docs/guides/runtime/typescript.mdx +51 -0
  137. package/docs/guides/runtime/vscode-debugger.mdx +48 -0
  138. package/docs/guides/runtime/web-debugger.mdx +103 -0
  139. package/docs/guides/streams/node-readable-to-arraybuffer.mdx +13 -0
  140. package/docs/guides/streams/node-readable-to-blob.mdx +13 -0
  141. package/docs/guides/streams/node-readable-to-json.mdx +14 -0
  142. package/docs/guides/streams/node-readable-to-string.mdx +14 -0
  143. package/docs/guides/streams/node-readable-to-uint8array.mdx +13 -0
  144. package/docs/guides/streams/to-array.mdx +16 -0
  145. package/docs/guides/streams/to-arraybuffer.mdx +16 -0
  146. package/docs/guides/streams/to-blob.mdx +16 -0
  147. package/docs/guides/streams/to-buffer.mdx +17 -0
  148. package/docs/guides/streams/to-json.mdx +16 -0
  149. package/docs/guides/streams/to-string.mdx +16 -0
  150. package/docs/guides/streams/to-typedarray.mdx +24 -0
  151. package/docs/guides/test/bail.mdx +24 -0
  152. package/docs/guides/test/coverage-threshold.mdx +67 -0
  153. package/docs/guides/test/coverage.mdx +49 -0
  154. package/docs/guides/test/happy-dom.mdx +73 -0
  155. package/docs/guides/test/migrate-from-jest.mdx +125 -0
  156. package/docs/guides/test/mock-clock.mdx +50 -0
  157. package/docs/guides/test/mock-functions.mdx +70 -0
  158. package/docs/guides/test/rerun-each.mdx +16 -0
  159. package/docs/guides/test/run-tests.mdx +116 -0
  160. package/docs/guides/test/skip-tests.mdx +43 -0
  161. package/docs/guides/test/snapshot.mdx +102 -0
  162. package/docs/guides/test/spy-on.mdx +49 -0
  163. package/docs/guides/test/svelte-test.mdx +113 -0
  164. package/docs/guides/test/testing-library.mdx +93 -0
  165. package/docs/guides/test/timeout.mdx +17 -0
  166. package/docs/guides/test/todo-tests.mdx +74 -0
  167. package/docs/guides/test/update-snapshots.mdx +49 -0
  168. package/docs/guides/test/watch-mode.mdx +24 -0
  169. package/docs/guides/util/base64.mdx +17 -0
  170. package/docs/guides/util/deep-equals.mdx +41 -0
  171. package/docs/guides/util/deflate.mdx +20 -0
  172. package/docs/guides/util/detect-bun.mdx +25 -0
  173. package/docs/guides/util/entrypoint.mdx +19 -0
  174. package/docs/guides/util/escape-html.mdx +24 -0
  175. package/docs/guides/util/file-url-to-path.mdx +16 -0
  176. package/docs/guides/util/gzip.mdx +20 -0
  177. package/docs/guides/util/hash-a-password.mdx +56 -0
  178. package/docs/guides/util/import-meta-dir.mdx +15 -0
  179. package/docs/guides/util/import-meta-file.mdx +15 -0
  180. package/docs/guides/util/import-meta-path.mdx +15 -0
  181. package/docs/guides/util/javascript-uuid.mdx +25 -0
  182. package/docs/guides/util/main.mdx +43 -0
  183. package/docs/guides/util/path-to-file-url.mdx +16 -0
  184. package/docs/guides/util/sleep.mdx +24 -0
  185. package/docs/guides/util/version.mdx +23 -0
  186. package/docs/guides/util/which-path-to-executable-bin.mdx +17 -0
  187. package/docs/guides/websocket/compression.mdx +33 -0
  188. package/docs/guides/websocket/context.mdx +74 -0
  189. package/docs/guides/websocket/pubsub.mdx +40 -0
  190. package/docs/guides/websocket/simple.mdx +35 -0
  191. package/docs/guides/write-file/append.mdx +54 -0
  192. package/docs/guides/write-file/basic.mdx +46 -0
  193. package/docs/guides/write-file/blob.mdx +30 -0
  194. package/docs/guides/write-file/cat.mdx +19 -0
  195. package/docs/guides/write-file/file-cp.mdx +18 -0
  196. package/docs/guides/write-file/filesink.mdx +54 -0
  197. package/docs/guides/write-file/response.mdx +19 -0
  198. package/docs/guides/write-file/stdout.mdx +23 -0
  199. package/docs/guides/write-file/stream.mdx +19 -0
  200. package/docs/guides/write-file/unlink.mdx +18 -0
  201. package/docs/index.mdx +133 -0
  202. package/docs/installation.mdx +365 -0
  203. package/docs/pm/bunx.mdx +83 -0
  204. package/docs/pm/catalogs.mdx +292 -0
  205. package/docs/pm/cli/add.mdx +179 -0
  206. package/docs/pm/cli/audit.mdx +60 -0
  207. package/docs/pm/cli/install.mdx +471 -0
  208. package/docs/pm/cli/link.mdx +48 -0
  209. package/docs/pm/cli/outdated.mdx +197 -0
  210. package/docs/pm/cli/patch.mdx +69 -0
  211. package/docs/pm/cli/pm.mdx +319 -0
  212. package/docs/pm/cli/publish.mdx +123 -0
  213. package/docs/pm/cli/remove.mdx +16 -0
  214. package/docs/pm/cli/update.mdx +140 -0
  215. package/docs/pm/cli/why.mdx +84 -0
  216. package/docs/pm/filter.mdx +102 -0
  217. package/docs/pm/global-cache.mdx +72 -0
  218. package/docs/pm/isolated-installs.mdx +205 -0
  219. package/docs/pm/lifecycle.mdx +57 -0
  220. package/docs/pm/lockfile.mdx +64 -0
  221. package/docs/pm/npmrc.mdx +111 -0
  222. package/docs/pm/overrides.mdx +83 -0
  223. package/docs/pm/scopes-registries.mdx +35 -0
  224. package/docs/pm/security-scanner-api.mdx +95 -0
  225. package/docs/pm/workspaces.mdx +109 -0
  226. package/docs/project/benchmarking.mdx +218 -0
  227. package/docs/project/bindgen.mdx +223 -0
  228. package/docs/project/building-windows.mdx +133 -0
  229. package/docs/project/contributing.mdx +343 -0
  230. package/docs/project/feedback.mdx +20 -0
  231. package/docs/project/license.mdx +78 -0
  232. package/docs/project/roadmap.mdx +8 -0
  233. package/docs/quickstart.mdx +240 -0
  234. package/docs/runtime/auto-install.mdx +97 -0
  235. package/docs/runtime/binary-data.mdx +846 -0
  236. package/docs/runtime/bun-apis.mdx +59 -0
  237. package/docs/runtime/bunfig.mdx +642 -0
  238. package/docs/runtime/c-compiler.mdx +204 -0
  239. package/docs/runtime/child-process.mdx +532 -0
  240. package/docs/runtime/color.mdx +267 -0
  241. package/docs/runtime/console.mdx +67 -0
  242. package/docs/runtime/cookies.mdx +454 -0
  243. package/docs/runtime/debugger.mdx +335 -0
  244. package/docs/runtime/environment-variables.mdx +214 -0
  245. package/docs/runtime/ffi.mdx +565 -0
  246. package/docs/runtime/file-io.mdx +306 -0
  247. package/docs/runtime/file-system-router.mdx +118 -0
  248. package/docs/runtime/file-types.mdx +354 -0
  249. package/docs/runtime/glob.mdx +181 -0
  250. package/docs/runtime/globals.mdx +72 -0
  251. package/docs/runtime/hashing.mdx +315 -0
  252. package/docs/runtime/html-rewriter.mdx +340 -0
  253. package/docs/runtime/http/cookies.mdx +79 -0
  254. package/docs/runtime/http/error-handling.mdx +40 -0
  255. package/docs/runtime/http/metrics.mdx +36 -0
  256. package/docs/runtime/http/routing.mdx +289 -0
  257. package/docs/runtime/http/server.mdx +647 -0
  258. package/docs/runtime/http/tls.mdx +101 -0
  259. package/docs/runtime/http/websockets.mdx +404 -0
  260. package/docs/runtime/index.mdx +223 -0
  261. package/docs/runtime/jsx.mdx +115 -0
  262. package/docs/runtime/module-resolution.mdx +342 -0
  263. package/docs/runtime/networking/dns.mdx +111 -0
  264. package/docs/runtime/networking/fetch.mdx +468 -0
  265. package/docs/runtime/networking/tcp.mdx +239 -0
  266. package/docs/runtime/networking/udp.mdx +129 -0
  267. package/docs/runtime/node-api.mdx +19 -0
  268. package/docs/runtime/nodejs-compat.mdx +468 -0
  269. package/docs/runtime/plugins.mdx +405 -0
  270. package/docs/runtime/redis.mdx +582 -0
  271. package/docs/runtime/s3.mdx +863 -0
  272. package/docs/runtime/secrets.mdx +336 -0
  273. package/docs/runtime/semver.mdx +57 -0
  274. package/docs/runtime/shell.mdx +637 -0
  275. package/docs/runtime/sql.mdx +1404 -0
  276. package/docs/runtime/sqlite.mdx +699 -0
  277. package/docs/runtime/streams.mdx +232 -0
  278. package/docs/runtime/templating/create.mdx +269 -0
  279. package/docs/runtime/templating/init.mdx +58 -0
  280. package/docs/runtime/transpiler.mdx +288 -0
  281. package/docs/runtime/typescript.mdx +58 -0
  282. package/docs/runtime/utils.mdx +922 -0
  283. package/docs/runtime/watch-mode.mdx +161 -0
  284. package/docs/runtime/web-apis.mdx +29 -0
  285. package/docs/runtime/workers.mdx +328 -0
  286. package/docs/runtime/yaml.mdx +469 -0
  287. package/docs/snippets/cli/add.mdx +166 -0
  288. package/docs/snippets/cli/build.mdx +196 -0
  289. package/docs/snippets/cli/feedback.mdx +17 -0
  290. package/docs/snippets/cli/init.mdx +84 -0
  291. package/docs/snippets/cli/install.mdx +173 -0
  292. package/docs/snippets/cli/link.mdx +163 -0
  293. package/docs/snippets/cli/outdated.mdx +140 -0
  294. package/docs/snippets/cli/patch.mdx +171 -0
  295. package/docs/snippets/cli/publish.mdx +198 -0
  296. package/docs/snippets/cli/remove.mdx +146 -0
  297. package/docs/snippets/cli/run.mdx +293 -0
  298. package/docs/snippets/cli/test.mdx +100 -0
  299. package/docs/snippets/cli/update.mdx +144 -0
  300. package/docs/snippets/product-card.mdx +32 -0
  301. package/docs/snippets/product-tiles.mdx +94 -0
  302. package/docs/test/code-coverage.mdx +409 -0
  303. package/docs/test/configuration.mdx +467 -0
  304. package/docs/test/dates-times.mdx +129 -0
  305. package/docs/test/discovery.mdx +90 -0
  306. package/docs/test/dom.mdx +226 -0
  307. package/docs/test/index.mdx +380 -0
  308. package/docs/test/lifecycle.mdx +348 -0
  309. package/docs/test/mocks.mdx +637 -0
  310. package/docs/test/reporters.mdx +117 -0
  311. package/docs/test/runtime-behavior.mdx +342 -0
  312. package/docs/test/snapshots.mdx +434 -0
  313. package/docs/test/writing-tests.mdx +635 -0
  314. package/docs/typescript.mdx +54 -0
  315. package/package.json +8 -6
  316. 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.