10 puntos por GN⁺ 2024-01-22 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2024-01-22
Comentarios en Hacker News
  • We've implemented many common commands and features like globbing, environment variables, redirection, piping, and more.

    • Esta nueva implementación de shell incluye comandos y funciones comunes como globbing, variables de entorno, redirección, piping y más.
    • Sin embargo, no queda claro qué tan compatible es con implementaciones existentes de shell y de coreutils.
    • No está claro si apunta a ser compatible con el estándar POSIX o con el shell Bourne, ni si soporta extensiones de GNU.
    • Faltan detalles sobre qué pasa cuando el sistema ya tiene GNU coreutils y si al agregar más comandos integrados en el futuro podrían producirse cambios inesperados.
    • Se señala que reemplazar un shell compatible con Bourne, como ZShell, por este shell no es deseable en la mayoría de los casos.
    • En el ecosistema de JS ya es necesario escribir comandos compatibles con varios shells, por lo que estandarizar un subconjunto útil de un shell compatible con Bourne podría hacer que funcione como se espera en todas las plataformas, manteniendo una compatibilidad casi total con lo que ya funciona en la mayoría de ellas.
  • Love that bun just implements anything that could be useful.

    • Se valora positivamente que Bun implemente cualquier cosa que pueda ser útil.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • Esta implementación de shell se ve muy parecida a zx de Google. Y eso probablemente sea algo bueno.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Se señala que en Arch Linux /bin/sh es un enlace simbólico a bash, así que en realidad se está midiendo lo mismo.
    • En sistemas como Debian, /bin/sh suele 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

    • Como desarrollador de Bun, está dispuesto a responder preguntas o comentarios.
  • 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.

    • Lo potente del shell scripting es que permite manejar fácilmente múltiples utilidades independientes que no necesitan estar dentro de la biblioteca estándar del shell, pero aquí no se percibe mucho énfasis en eso.
    • También se señala que incrustar un lenguaje como cadena dentro de otro lenguaje casi nunca ofrece una buena experiencia de usuario.
    • Aun así, la portabilidad de este shell sí resuelve un problema importante en la práctica.
  • 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!

    • Recomienda la popular biblioteca de JS Execa[1], que funciona en todos los runtimes de JS (Deno, Node) y logra básicamente lo mismo.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • Otra alternativa es la biblioteca de JS ZX shell[2], aunque no la ha probado.
  • 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!

    • Le encanta Bun y ya no usa Node para desarrollo. Casi no presenta problemas inesperados y es más rápido en general. Especialmente 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:

    • No sabía que en JS se puede ejecutar una función sin paréntesis usando acentos graves (`), por ejemplo. Bun también usa la función signo de dólar ($) para ejecutar comandos de shell, lo cual es una de esas rarezas sintácticas de JS.
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • Este shell se está acercando a la ergonomía que Perl ha ofrecido durante décadas. Y Perl todavía lo hace mejor.