- Das Aufrufen der Shell aus JavaScript/TypeScript wird einfacher
- Plattformübergreifend nutzbar auf Linux, Windows und macOS
- Gängige Befehle und Funktionen werden intern vollständig implementiert: Globbing, Umgebungsvariablen, Redirection, Piping
- Obwohl JavaScript die weltweit beliebteste Skriptsprache ist, ist das Ausführen von Shell-Skripten damit schwierig.
- Mit der Funktion
spawnSync aus dem Modul child_process oder der Funktion readdir aus fs/promises lassen sich ähnliche Aufgaben erledigen, aber nicht so einfach wie mit herkömmlichen Shell-Skripten.
Kompatibilitätsprobleme zwischen klassischen Shells und JavaScript
- Shells wie
bash oder sh werden seit Jahrzehnten verwendet, funktionieren aber in JavaScript nicht gut.
zsh auf macOS, bash auf Linux und cmd auf Windows haben unterschiedliche Syntaxen und Befehle, was zu Kompatibilitätsproblemen führt.
- npm hat bislang darauf gesetzt, dass die Community fehlende Befehle mit JavaScript-Implementierungen ergänzt.
Befehle, die unter Windows nicht funktionieren
- Der Befehl
rm -rf funktioniert unter Windows nicht, weshalb die plattformübergreifende JavaScript-Implementierung rimraf 60 Millionen Mal pro Woche heruntergeladen wird.
- Das Setzen von Umgebungsvariablen unterscheidet sich je nach Plattform; unter Windows muss dafür
cross-env verwendet werden.
- Der Befehl
which heißt unter Windows where; auch das zugehörige Paket wird 60 Millionen Mal pro Woche heruntergeladen.
Problem mit der Startzeit von Shells
- Das Starten einer Shell dauert auf einer Linux-x64-Hetzner-Arch-Linux-Maschine etwa 7 ms.
- Wenn nur ein einzelner Befehl ausgeführt wird, kann das Starten der Shell länger dauern als die Ausführung des Befehls selbst.
- Werden viele Befehle in einer Schleife ausgeführt, kann das kostspielig werden.
Warum Polyfills nötig waren
- Als JavaScript von 2009 bis 2016 noch relativ neu und experimentell war, war es sinnvoll, fehlende Funktionen durch Polyfills aus der Community zu ergänzen.
- Im Jahr 2024 ist JavaScript auf Servern jedoch ausgereift und weit verbreitet, und das JavaScript-Ökosystem versteht die aktuellen Anforderungen besser als früher.
Einführung in Bun Shell
- Bun Shell ist eine neue experimentelle Sprache und ein Interpreter, der in Bun integriert ist und das Ausführen plattformübergreifender Shell-Skripte in JavaScript und TypeScript ermöglicht.
- Mit Bun Shell können JavaScript-Variablen in Shell-Skripten verwendet werden, und alle Template-Variablen werden escaped, um die Sicherheit zu erhöhen.
- Bun Shell fühlt sich wie normales JavaScript an und kann
stdout in einen Buffer oder eine Datei umleiten oder an andere Befehle pipen.
- Integrierte Befehle wie
cd, echo und rm können verwendet werden und funktionieren unter Windows, macOS und Linux.
- Bun Shell wurde als Ersatz für einfache Shell-Skripte entwickelt und führt bei der Verwendung von Bun unter Windows
bun run in den package.json-scripts aus.
- Es kann auch als eigenständiger Shell-Skript-Interpreter verwendet werden.
Installation
- Bun Shell ist in Bun integriert und kann sofort verwendet werden, wenn Bun v1.0.24 oder höher installiert ist.
- Falls Bun noch nicht installiert ist, kann es mit curl oder npm installiert werden.
Meinung von GN⁺
- Bun Shell präsentiert einen innovativen Ansatz, um die Kompatibilitätsprobleme zwischen klassischen Shell-Skripten und JavaScript zu lösen.
- Die plattformübergreifende Unterstützung und die einfache Nutzung ermöglichen Entwicklern ein konsistentes Scripting-Erlebnis in unterschiedlichen Umgebungen.
- Solche Werkzeuge spiegeln die Reife des JavaScript-Ökosystems wider und dürften dazu beitragen, die Produktivität von Entwicklern in einem sich schnell wandelnden technischen Umfeld zu steigern.
1 Kommentare
Hacker-News-Kommentare
coreutils-Implementierungen.coreutilsvorhanden sind, und ob künftige eingebaute Befehle zu unerwarteten Änderungen führen könnten.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/shein symbolischer Link aufbashist und daher tatsächlich dasselbe gemessen wird./bin/shhingegendash, das beim Start und in der allgemeinen Performance um ein Vielfaches schneller alsbashist.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 testwird hervorgehoben. Klare Empfehlung. Danke @Jarred!I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:
`) ausführen kann. Auch Bun verwendet zum Ausführen von Shell-Befehlen eine Dollarzeichen-Funktion ($), was als eine der seltsamen Syntax-Magien von JS beschrieben wird.Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.