- Hace que invocar la shell desde Javascript/Typescript sea más fácil
- Es multiplataforma, por lo que puede usarse en Linux/Windows/macOS
- Implementa internamente comandos y funciones comunes: globbing, variables de entorno, redirection, piping
- Aunque JavaScript es el lenguaje de scripting más popular del mundo, ejecutar scripts de shell desde ahí ha sido difícil.
- Se pueden hacer tareas similares usando la función
spawnSync del módulo child_process o la función readdir de fs/promises, pero no es tan simple como los scripts de shell tradicionales.
Problemas de compatibilidad entre las shells existentes y JavaScript
- Las shells como
bash o sh se han usado durante décadas, pero no funcionan bien desde JavaScript.
zsh en macOS, bash en Linux y cmd en Windows tienen sintaxis y comandos distintos, lo que genera problemas de compatibilidad.
- npm ha dependido de que la comunidad complete en JavaScript los comandos faltantes.
Comandos que no funcionan en Windows
- El comando
rm -rf no funciona en Windows, por lo que una implementación multiplataforma en JavaScript llamada rimraf se descarga 60 millones de veces por semana.
- La configuración de variables de entorno cambia según la plataforma, y en Windows hay que usar
cross-env.
- El comando
which en Windows se usa como where, y también existe un paquete para eso que se descarga 60 millones de veces por semana.
El problema del tiempo de arranque de la shell
- Iniciar una shell toma alrededor de 7 ms en una máquina Linux x64 Hetzner con Arch Linux.
- Si se ejecuta un solo comando, el tiempo de arranque de la shell puede ser mayor que el tiempo de ejecución del propio comando.
- Ejecutar muchos comandos dentro de un loop puede resultar costoso.
La necesidad de un polyfill
- Entre 2009 y 2016, cuando JavaScript era relativamente nuevo y experimental, tenía sentido que la comunidad hiciera polyfills de las funciones faltantes.
- Pero en 2024, JavaScript en el servidor ya es maduro y ampliamente adoptado, y su ecosistema entiende mucho mejor las necesidades actuales.
Presentación de Bun Shell
- Bun Shell es un nuevo lenguaje e intérprete experimental integrado en Bun, que permite ejecutar scripts de shell multiplataforma desde JavaScript y TypeScript.
- Con Bun Shell, se pueden usar variables de JavaScript dentro de scripts de shell, y todas las variables de plantilla se escapan para reforzar la seguridad.
- Bun Shell se siente como JavaScript normal, y permite redirigir stdout a un buffer o a un archivo, o encadenarlo con otros comandos mediante pipes.
- Se pueden usar comandos integrados como
cd, echo y rm, y funciona en Windows, macOS y Linux.
- Bun Shell fue diseñado para reemplazar scripts de shell simples y, al usar Bun en Windows, ejecuta
bun run desde los "scripts" de package.json.
- También puede usarse como un intérprete independiente de scripts de shell.
Cómo instalarlo
- Bun Shell viene integrado en Bun, y si tienes instalado Bun v1.0.24 o superior, puedes usarlo de inmediato.
- Si no tienes Bun instalado, puedes instalarlo usando curl o npm.
Opinión de GN⁺
- Bun Shell propone un enfoque innovador para resolver los problemas de compatibilidad entre los scripts de shell tradicionales y JavaScript.
- Su soporte multiplataforma y facilidad de uso permiten a los desarrolladores tener una experiencia de scripting consistente en distintos entornos.
- Herramientas como esta reflejan la madurez del ecosistema de JavaScript y se espera que contribuyan a mejorar la productividad de los desarrolladores en un entorno tecnológico que cambia rápidamente.
1 comentarios
Comentarios en Hacker News
Love that bun just implements anything that could be useful.
This looks exactly like zx by Google. And that's probably a good thing.
/bin/shes un enlace simbólico a bash, así que en realidad se está midiendo lo mismo./bin/shsuele ser dash, que arranca y rinde varias veces más rápido que bash en tareas comunes.I work on Bun - happy to answer any questions/feedback
This is neat, but a) it strikes me that what's powerful about shell scripting is that it lets you easily wrangle multiple independent utilities that don't need to be contained within the shell stdlib (maybe I'm missing something but I didn't see any emphasis on that), and b) that embedding a language as a string inside another language is very rarely a good UX.
For something which works across all JS runtimes (Deno, Node) and achieves basically the same, check out the popular JS library Execa[1]. Works like a charm!
Another alternative is the ZX shell[2] JS library. Tho haven't tested it.
I love Bun. I no longer use Node for development. Hardly any gotchas anymore. It's just faster all over. Especially
bun test. Highly recommended. Thank you @Jarred!bun test. Lo recomienda mucho. Gracias, @Jarred.I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:
Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.