10 Punkte von GN⁺ 2024-01-22 | 1 Kommentare | Auf WhatsApp teilen
  • 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

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

    • Die neue Shell-Implementierung umfasst gängige Befehle und Funktionen wie Globbing, Umgebungsvariablen, Umleitungen, Piping und mehr.
    • Allerdings gibt es wenig Vertrauen in die Kompatibilität mit bestehenden Shells und coreutils-Implementierungen.
    • Es ist unklar, ob POSIX-Kompatibilität oder Kompatibilität mit der Bourne-Shell angestrebt wird und ob GNU-Erweiterungen unterstützt werden.
    • Es fehlen Details dazu, was passiert, wenn auf dem System GNU coreutils vorhanden sind, und ob künftige eingebaute Befehle zu unerwarteten Änderungen führen könnten.
    • Es wird darauf hingewiesen, dass es in den meisten Situationen nicht wünschenswert ist, eine Bourne-kompatible Shell wie ZShell durch diese Shell zu ersetzen.
    • Da man im JS-Ökosystem ohnehin Befehle schreiben muss, die mit verschiedenen Shells kompatibel sind, könnte die Standardisierung einer nützlichen Teilmenge Bourne-kompatibler Shells dafür sorgen, dass es nahezu 100 % kompatibel mit dem ist, was auf den meisten Plattformen bereits funktioniert, und zugleich auf allen Plattformen wie beabsichtigt läuft.
  • Love that bun just implements anything that could be useful.

    • Positiv hervorgehoben wird, dass Bun einfach alles implementiert, was nützlich sein könnte.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • Diese Shell-Implementierung sieht Google zx sehr ähnlich. Das könnte durchaus gut sein.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Es wird darauf hingewiesen, dass auf Arch Linux /bin/sh ein symbolischer Link auf bash ist und daher tatsächlich dasselbe gemessen wird.
    • Auf Systemen wie Debian ist /bin/sh hingegen dash, das beim Start und in der allgemeinen Performance um ein Vielfaches schneller als bash ist.
  • I work on Bun - happy to answer any questions/feedback

    • Als Bun-Entwickler ist der Kommentierende gerne bereit, Fragen zu beantworten und Feedback entgegenzunehmen.
  • 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.

    • Das ist zwar schick, aber die Stärke von Shell-Scripting liegt darin, dass man viele unabhängige Utilities einfach koordinieren kann, ohne dass sie in der Shell-Stdlib enthalten sein müssen; hier fehlt dieser Aspekt offenbar.
    • Außerdem wird angemerkt, dass es nur sehr selten eine gute UX ist, eine Sprache als String in eine andere Sprache einzubetten.
    • Die Portabilität dieser Shell löst allerdings tatsächlich ein großes Problem.
  • 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!

    • Empfohlen wird die populäre JS-Bibliothek Execa[1], die in allen JS-Runtimes (Deno, Node) funktioniert und im Wesentlichen dasselbe leistet.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • Eine weitere Alternative ist die JS-Bibliothek ZX shell[2], sie wurde allerdings nicht getestet.
  • 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 wird sehr geschätzt; für die Entwicklung wird Node nicht mehr verwendet. Es gibt kaum noch Stolperfallen, und insgesamt ist alles schneller. Besonders bun test wird hervorgehoben. Klare Empfehlung. Danke @Jarred!
  • I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:

    • Es war nicht bekannt, dass man in JS eine Funktion ohne Klammern mit Backticks (`) 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.

    • Diese Shell nähert sich der Ergonomie an, die Perl seit Jahrzehnten bietet. Und Perl macht es immer noch besser.