10 points par GN⁺ 2024-01-22 | 1 commentaires | Partager sur WhatsApp
  • Il devient plus facile d’appeler le shell depuis JavaScript/TypeScript
  • Compatible cross-platform, avec prise en charge de Linux, Windows et macOS
    • Les commandes et fonctionnalités communes sont toutes implémentées en interne : globbing, variables d’environnement, redirection, piping
  • Bien que JavaScript soit le langage de script le plus populaire au monde, il reste difficile d’exécuter des scripts shell.
  • Il est possible d’effectuer des tâches similaires avec la fonction spawnSync du module child_process ou la fonction readdir de fs/promises, mais cela n’est pas aussi simple que les scripts shell traditionnels.

Problèmes de compatibilité entre les shells existants et JavaScript

  • Les shells comme bash ou sh sont utilisés depuis des décennies, mais fonctionnent mal avec JavaScript.
  • Le zsh de macOS, le bash de Linux et le cmd de Windows ont des syntaxes et des commandes différentes, ce qui entraîne des problèmes de compatibilité.
  • npm s’est appuyé sur une approche où la communauté comble en JavaScript les commandes manquantes.

Commandes qui ne fonctionnent pas sous Windows

  • La commande rm -rf ne fonctionne pas sous Windows, si bien que son implémentation JavaScript cross-platform, rimraf, est téléchargée 60 millions de fois par semaine.
  • La définition des variables d’environnement diffère selon les plateformes, et sous Windows il faut utiliser cross-env.
  • La commande which s’utilise sous Windows via where, et le paquet correspondant est lui aussi téléchargé 60 millions de fois par semaine.

Le problème du temps de démarrage du shell

  • Le démarrage d’un shell prend environ 7 ms sur une machine Linux x64 Hetzner Arch Linux.
  • Lorsqu’on exécute une seule commande, le temps de démarrage du shell peut être plus long que celui de la commande elle-même.
  • Exécuter beaucoup de commandes dans une boucle peut donc avoir un coût important.

La nécessité des polyfills

  • De 2009 à 2016, lorsque JavaScript était encore relativement nouveau et expérimental, il était logique que la communauté polyfill les fonctionnalités manquantes.
  • Mais en 2024, JavaScript côté serveur est mature et largement adopté, et son écosystème comprend mieux les besoins actuels qu’auparavant.

Présentation de Bun Shell

  • Bun Shell est un nouveau langage et interpréteur expérimental intégré à Bun, qui permet d’exécuter des scripts shell cross-platform en JavaScript et TypeScript.
  • Avec Bun Shell, on peut utiliser des variables JavaScript dans des scripts shell, et toutes les variables de template sont échappées afin de renforcer la sécurité.
  • Bun Shell donne une sensation proche du JavaScript classique, et permet de rediriger stdout vers un buffer ou un fichier, ou de le pipeliner vers une autre commande.
  • Il propose des commandes intégrées comme cd, echo et rm, et fonctionne sur Windows, macOS et Linux.
  • Bun Shell est conçu pour remplacer les scripts shell simples, et exécute bun run dans les scripts de package.json lorsqu’on utilise Bun sous Windows.
  • Il peut aussi être utilisé comme interpréteur de scripts shell autonome.

Installation

  • Bun Shell est intégré à Bun et peut être utilisé immédiatement si Bun v1.0.24 ou une version supérieure est installé.
  • Si Bun n’est pas installé, il peut être installé avec curl ou npm.

L’avis de GN⁺

  • Bun Shell propose une approche innovante pour résoudre les problèmes de compatibilité entre les scripts shell traditionnels et JavaScript.
  • Son support cross-platform et sa simplicité d’utilisation permettent aux développeurs de bénéficier d’une expérience de scripting cohérente dans des environnements variés.
  • Ce type d’outil reflète la maturité de l’écosystème JavaScript et devrait contribuer à améliorer la productivité des développeurs dans un environnement technologique en évolution rapide.

1 commentaires

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

    • Cette nouvelle implémentation de shell inclut des commandes et fonctionnalités courantes (globbing, variables d’environnement, redirection, piping, etc.).
    • Mais il y a peu de certitudes quant à sa compatibilité avec les shells existants et les implémentations de coreutils.
    • On ne sait pas clairement si l’objectif est la compatibilité avec le standard POSIX ou avec le shell Bourne, ni si les extensions GNU sont prises en charge.
    • Il manque des détails sur le comportement quand le système dispose de GNU coreutils, ainsi que sur la possibilité de changements inattendus à l’avenir lors de l’ajout de commandes intégrées.
    • Il est souligné qu’il n’est généralement pas souhaitable, dans la plupart des cas, de remplacer un shell compatible Bourne comme ZShell par ce shell.
    • Dans l’écosystème JS, il faut déjà écrire des commandes compatibles avec divers shells ; standardiser un sous-ensemble utile des shells compatibles Bourne permettrait d’être presque 100 % compatible avec ce qui fonctionne déjà sur la plupart des plateformes, tout en garantissant un comportement conforme aux intentions sur toutes les plateformes.
  • Love that bun just implements anything that could be useful.

    • Le fait que Bun implémente tout ce qui peut être utile est vu très positivement.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • Cette implémentation de shell ressemble beaucoup à zx de Google. Et c’est probablement une bonne chose.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Il est signalé que sur Arch Linux, /bin/sh est un lien symbolique vers bash, donc on mesure en réalité la même chose.
    • Sur des systèmes comme Debian, /bin/sh pointe vers dash, qui démarre et s’exécute généralement plusieurs fois plus vite que bash.
  • I work on Bun - happy to answer any questions/feedback

    • En tant que développeur de Bun, il se dit prêt à répondre à toutes les questions et à recueillir les retours.
  • 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.

    • L’un des grands atouts du scripting shell est de permettre de manipuler facilement plusieurs utilitaires indépendants sans qu’ils aient besoin d’être intégrés à la bibliothèque standard du shell, et cet aspect ne semble pas vraiment mis en avant ici.
    • Il est également souligné qu’imbriquer un langage sous forme de chaîne dans un autre langage constitue rarement une bonne expérience utilisateur.
    • En revanche, la portabilité de ce shell résout effectivement un problème important.
  • 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!

    • Il recommande la bibliothèque JS populaire Execa[1], qui fonctionne sur tous les runtimes JS (Deno, Node) et offre globalement les mêmes possibilités.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • La bibliothèque JS ZX shell[2] peut aussi être une alternative, même s’il ne l’a pas testée.
  • 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!

    • Il apprécie énormément Bun et n’utilise désormais plus Node pour le développement. Il y a presque plus de pièges, et l’ensemble est simplement plus rapide. Surtout bun test. Fortement recommandé. Merci @Jarred !
  • I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:

    • Il a découvert qu’en JS, on peut apparemment exécuter une fonction sans parenthèses en utilisant des accents graves (). Bun utilise aussi une fonction dollar ($`) pour exécuter des commandes shell, ce qui relève de l’une des bizarreries syntaxiques de JS.
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • Ce shell se rapproche de l’ergonomie que Perl propose depuis des décennies. Et Perl le fait toujours mieux.