10 puan yazan GN⁺ 2024-01-22 | 1 yorum | WhatsApp'ta paylaş
  • JavaScript/TypeScript içinden Shell çağırmak kolaylaşıyor
  • Çapraz platform desteğiyle Linux/Windows/macOS üzerinde kullanılabiliyor
    • Ortak komutlar ve işlevlerin tamamı dahili olarak uygulanmış: globbing, ortam değişkenleri, redirection, piping
  • JavaScript dünyadaki en popüler betik dili olmasına rağmen, shell betiklerini çalıştırmak zordu.
  • child_process modülünün spawnSync fonksiyonu ya da fs/promises içindeki readdir fonksiyonu kullanılarak benzer işler yapılabiliyor, ancak bunlar mevcut shell betikleri kadar basit değil.

Mevcut shell'ler ile JavaScript arasındaki uyumluluk sorunu

  • bash veya sh gibi shell'ler onlarca yıldır kullanılıyor, ancak JavaScript içinde iyi çalışmıyor.
  • macOS'taki zsh, Linux'taki bash ve Windows'taki cmd farklı sözdizimleri ve komutlara sahip olduğu için uyumluluk sorunları ortaya çıkıyor.
  • npm, topluluğun eksik komutları JavaScript implementasyonlarıyla tamamladığı bir yaklaşımı benimsedi.

Windows'ta çalışmayan komutlar

  • rm -rf komutu Windows'ta çalışmadığı için, bunun çapraz platform JavaScript implementasyonu olan rimraf haftada 60 milyon kez indiriliyor.
  • Ortam değişkeni ayarlama her platformda farklı ve Windows'ta bunun için cross-env kullanmak gerekiyor.
  • which komutu Windows'ta where olarak kullanılıyor; bunun için olan paket de haftada 60 milyon kez indiriliyor.

Shell başlatma süresi sorunu

  • Bir shell'i başlatmanın süresi, Linux x64 Hetzner Arch Linux makinesinde yaklaşık 7 ms sürüyor.
  • Tek bir komut çalıştırıldığında, shell'i başlatma süresi komutun çalışma süresinden daha uzun olabilir.
  • Döngü içinde çok sayıda komut çalıştırmak maliyetli olabilir.

Polyfill ihtiyacı

  • 2009'dan 2016'ya kadar, JavaScript görece yeni ve deneyselken, topluluğun eksik işlevleri polyfill ile tamamlaması anlamlıydı.
  • Ancak 2024 itibarıyla sunucudaki JavaScript olgunlaşmış ve yaygın biçimde benimsenmiş durumda; JavaScript ekosistemi de bugünün ihtiyaçlarını geçmişe göre daha iyi anlıyor.

Bun Shell'e giriş

  • Bun Shell, Bun'a yerleşik gelen yeni ve deneysel bir dil ile yorumlayıcıdır; JavaScript ve TypeScript içinden çapraz platform shell betikleri çalıştırmayı sağlar.
  • Bun Shell ile JavaScript değişkenlerini shell betiklerinde kullanabilirsiniz ve tüm şablon değişkenleri güvenliği artırmak için escape edilir.
  • Bun Shell normal JavaScript gibi hissettirir; stdout bir buffer'a ya da dosyaya yönlendirilebilir veya başka komutlara pipe edilebilir.
  • cd, echo, rm gibi yerleşik komutlar kullanılabilir ve Windows, macOS, Linux üzerinde çalışır.
  • Bun Shell, basit shell betiklerinin yerini almak üzere tasarlandı ve Windows'ta Bun kullanılırken package.json içindeki "scripts" bölümünde bun run çalıştırır.
  • Bağımsız bir shell betiği yorumlayıcısı olarak da kullanılabilir.

Kurulum

  • Bun Shell, Bun'a yerleşik olarak gelir; Bun v1.0.24 veya üzeri yüklüyse hemen kullanılabilir.
  • Bun yüklü değilse curl veya npm kullanılarak kurulabilir.

GN⁺ görüşü

  • Bun Shell, mevcut shell betikleri ile JavaScript arasındaki uyumluluk sorununu çözmeye çalışan yenilikçi bir yaklaşım sunuyor.
  • Çapraz platform desteği ve kolay kullanımı, geliştiricilerin farklı ortamlarda tutarlı bir betikleme deneyimi yaşamasını sağlayabilir.
  • Bu tür araçlar, JavaScript ekosisteminin olgunluğunu yansıtıyor ve hızla değişen teknoloji ortamında geliştirici üretkenliğini artırmaya katkı sağlayabilir.

1 yorum

 
GN⁺ 2024-01-22
Hacker News görüşleri
  • We've implemented many common commands and features like globbing, environment variables, redirection, piping, and more.

    • Yeni shell implementasyonu; globbing, environment variables, redirection, piping gibi yaygın komut ve özellikleri içeriyor.
    • Ancak mevcut shell'ler ve coreutils implementasyonlarıyla uyumluluğu konusunda yeterli güven vermiyor.
    • POSIX standardını ya da Bourne shell uyumluluğunu hedefleyip hedeflemediği ve GNU genişletmelerini destekleyip desteklemediği belirsiz.
    • Sistemde GNU coreutils varken ne olacağı ve gelecekte yerleşik komutlar eklendiğinde beklenmedik değişiklikler yaşanıp yaşanmayacağı konusunda ayrıntı eksikliği var.
    • ZShell gibi Bourne uyumlu bir shell'i bununla değiştirmenin çoğu durumda arzu edilir olmadığına dikkat çekiliyor.
    • JS ekosisteminde zaten farklı shell'lerle uyumlu komutlar yazmak gerektiği için, Bourne uyumlu shell'in faydalı bir alt kümesini standartlaştırmak; çoğu platformda zaten çalışan yapıyla neredeyse %100 uyumlu kalırken aynı zamanda her platformda amaçlandığı gibi çalışmasını sağlayabilir.
  • Love that bun just implements anything that could be useful.

    • Bun'ın faydalı olabilecek her şeyi implement etmesi olumlu değerlendiriliyor.
  • This looks exactly like zx by Google. And that's probably a good thing.

    • Bu shell implementasyonu Google'ın zx aracına çok benziyor. Bu da muhtemelen iyi bir şey.
  • $ hyperfine --warmup 3 'bash -c "echo hello"' 'sh -c "echo hello"' -N

    • Arch Linux'ta /bin/sh, bash'e sembolik link olduğu için aslında aynı şeyin ölçüldüğüne dikkat çekiliyor.
    • Debian gibi sistemlerde ise /bin/sh, dash'tir ve açılışta ve genel performansta bash'ten birkaç kat daha hızlıdır.
  • I work on Bun - happy to answer any questions/feedback

    • Bun geliştiricisi olarak, soruları veya geri bildirimleri yanıtlamaya hazır olduğunu belirtiyor.
  • 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.

    • Shell scripting'in güçlü yanı, shell stdlib içinde yer almak zorunda olmayan birden fazla bağımsız aracı kolayca yönetebilmesidir; ancak bu yeni shell'de bunun özellikle vurgulandığını görmek zor.
    • Bir dili başka bir dilin içine string olarak gömmek ise çok nadiren iyi bir kullanıcı deneyimi sunar.
    • Buna rağmen bu shell'in taşınabilirliği gerçekten önemli bir sorunu çözüyor.
  • 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!

    • Tüm JS runtime'larında (Deno, Node) çalışan ve temelde aynı şeyi yapan bir çözüm olarak popüler JS kütüphanesi Execa[1] öneriliyor. Sorunsuz çalıştığı belirtiliyor.
  • Another alternative is the ZX shell[2] JS library. Tho haven't tested it.

    • ZX shell[2] JS kütüphanesi de bir başka alternatif olarak gösteriliyor. Ancak test edilmediği belirtiliyor.
  • 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'ı çok sevdiğini, artık geliştirme için Node kullanmadığını söylüyor. Neredeyse hiç pürüz kalmadığını ve genel olarak daha hızlı olduğunu belirtiyor. Özellikle bun test övülüyor. Güçlü biçimde tavsiye ediliyor.
  • I didn't know, but apparently you can execute a function in JS without parentheses using upticks (`), e.g:

    • JS'te bir fonksiyonun parantez olmadan ters tırnak () kullanılarak çalıştırılabildiğini yeni öğrendiğini söylüyor. Bun'ın da shell komutlarını çalıştırmak için dolar işaretiyle ($`) bir fonksiyon kullanması, JS'in tuhaf sözdizimi sihirlerinden biri olarak görülüyor.
  • Great, it's approaching the ergonomics of what Perl has offered for decades. And Perl still does it better.

    • Bunun, Perl'ün onlarca yıldır sunduğu ergonomiye yaklaştığı belirtiliyor. Yine de Perl'ün hâlâ bunu daha iyi yaptığı söyleniyor.