- 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
Avis 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/shest un lien symbolique vers bash, donc on mesure en réalité la même chose./bin/shpointe 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
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. Fortement recommandé. Merci @Jarred !I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:
). 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.