- 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
Hacker News görüşleri
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/sh, bash'e sembolik link olduğu için aslında aynı şeyin ölçüldüğüne dikkat çekiliyor./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
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ö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:
) 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.