Node.js komut dosyaları için uygun hashbang


95

Birden çok ortamda çalışacak node.js için bir komut dosyası oluşturmaya çalışıyorum. Özellikle benim için OS X ve Ubuntu arasında gidip geliyorum. İlkinde Düğüm olarak kurulur node, ancak ikincisinde öyle nodejs. Senaryomun en üstünde şunlara sahip olabilirim:

#!/usr/bin/env node

veya

#!/usr/bin/env nodejs

Komutun, komutlardan birinin veya diğerinin komutu ( ./script-name.jsvs. node script-name.js) belirtmesi yerine, düğüm kurulu olduğu sürece her iki ortam için de çalıştırılabilir olarak çalıştırılmasını tercih ederim .

Her iki durumda da node.js için uyumlu olan bir yedek hashbang belirtmenin herhangi bir yolu var mı?


betiğinizi çağırmak için düğümün nerede yaşadığını ve ne dendiğini bulmaya çalışan bir sarmalayıcı kabuk betiği yapabilirsiniz.
Doon

4
Unix sitesinde bu cevap için birçok öneri - unix.stackexchange.com/questions/65235/…
sargant

Ben değişti bir nodejs komut dosyası var #!/usr/bin/nodeiçin #!/usr/bin/nodejsben Ubuntu 12.04 dan 12.10 yükseltilmiş zaman. Ve her ikisini de kontrol eden bir sarmalayıcıdan çağrılır. Arasında tartışma için #!/usr/bin/envhack, bkz bu soruyu ve benim cevap .
Keith Thompson

1
Aşama 3'te kullanılan hashbang'leri standartlaştırmayı amaçlayan "Hashbang Dilbilgisi" adlı TC39 önerisi var: github.com/tc39/proposal-hashbang
M. Twarog

Yanıtlar:


151

Komut dosyanız Düğüm geliştiricileri tarafından kullanılmak üzere tasarlanmışsa, kesinlikle yalnızca

#!/usr/bin/env node

ve yalnızca Node olarak yüklenmiş kişilerle uyumluluk için denemekten zahmet etmeyin nodejs.

Gerekçe:

  • Havalı çocukların yaptığı budur ve siz de yapmazsanız, havalı değilsiniz. Jshint , karma , bower ve hatta npm gibi büyük düğüm projeleri #!/usr/bin/env node, çalıştırılabilir betikleri için shebang olarak kullanır .
  • Havalı çocuklar bunu yaptığı için, Ubuntu'da Node ile çalışan herkes için /usr/bin/nodebir sembolik bağlantı kurdu nodejs. Burada Stack Overflow'da ve tüm web'de bunu yapmak için çok görüntülenen talimatlar var. nodejs-legacyBütün amacı bu sembolik bağı sizin için yaratmak olan bir paket bile vardı. Düğüm kullanan insanlar Ubuntu bu sorunun nasıl biliyorlar ve var onlar hemen hemen hiç Düğüm yazılmış herhangi bir yazılım kullanmak istiyorsanız.
  • Sorun artık Ubuntu 14.04'te var gibi görünmüyor; Node'u temizledim ve bir çalıştırdım apt-get install nodejsve /usr/bin/nodebir sembolik bağlantı oluşturdu /etc/alternatives/node. Bu sorundan etkilenen insanlar, sanırım, küçülen bir azınlık.

Node okuma yazma bilmeyen kişileri hedefliyor olsanız bile #!/usr/bin/env node, muhtemelen manuel sembolik bağlantı oluşturma veya nodejs-legacypaketin kurulumunu gerekli görürseniz kurulum belgelerinize eklemeye yönelik olası ihtiyacı da kullanmak isteyebilirsiniz . Yukarıdaki shebang'ı olan nodejsancak nodemevcut olmayan biri programınızı çalıştırmaya çalışırsa şunu görecektir:

/ usr / bin / env: node: Böyle bir dosya veya dizin yok

ve o Googling onlara ilk sayfadaki ilk sonuç düzeltme ve birçok kez verecektir.

Kullanıcının yazılımınızı nodejsmevcut olan ancak bulunmayan node(veya nodeaslında Amatör Paket Radyo Düğümü programının bulunduğu ) bir sistemde gerçekten, umutsuzca çalıştırmasını istiyorsanız , o zaman alınan bu "iki satırlı shebang" ı kullanabilirsiniz. dan Unix & Linux Stack Borsası :

#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@"

console.log('Hello world!');

ama Düğüm dünyasında neredeyse hiç kimse olmadığında bunu gerçekten yapmanız gerekiyor mu?


2
nodejsYürütülebilir dosya için destek tercih edilirse , #!/bin/shve ile bir shebang kullanmayı biraz daha güzel bulabilirsiniz //bin/false || exec "$(command -v nodejs || command -v node)" "$0".
lennartcl

2
O Not Linux üzerinde düğüme argümanları geçemez gibi, --experimental-modulesbu kullanırsanız, envmesele çizgi. Etrafta hackler var ama çirkinler .
Dan Dascalescu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.