Bir yorumlayıcı tarafından çalıştırılacak komut dosyalarının normalde üstte işletim sistemine bunları nasıl çalıştıracağını söyleyen bir shebang satırı vardır.
fooİlk satırı olan bir betik adınız varsa #!/bin/sh, sistem o ilk satırı okuyacak ve eşdeğerini çalıştıracaktır /bin/sh foo. Bu nedenle, çoğu yorumlayıcı bir komut dosyası dosyasının adını komut satırı argümanı olarak kabul edecek şekilde ayarlanmıştır.
Aşağıdaki yorumlayıcı adı #!tam bir yol olmalıdır; OS $PATH, tercümanı bulmak için sizin arama yapmaz .
Çalıştırılacak bir komut dosyanız varsa node, ilk satırı yazmanın en açık yolu şudur:
#!/usr/bin/node
ancak nodekomut yüklü değilse bu çalışmaz /usr/bin.
Yaygın bir çözüm, envkomutu kullanmaktır ( aslında bu amaç için tasarlanmamıştır):
#!/usr/bin/env node
Komut dosyanız çağrılırsa foo, işletim sistemi eşdeğerini yapacaktır.
/usr/bin/env node foo
envKomut, bu komut için bir bağımsız değişken aşağıdaki geçen, adı, komut satırında verilen bir komutu yürütür. Burada kullanılmasının nedeni , komutu envarayacak olmasıdır $PATH. Yani eğer nodeyüklenir /usr/local/bin/nodeve sahip /usr/local/binGözlerinde farklı $PATH, envkomut çağıracağı /usr/local/bin/node foo.
envKomutun temel amacı, değiştirilmiş bir ortamda başka bir komutu yürütmek, komutu çalıştırmadan önce belirtilen ortam değişkenlerini eklemek veya kaldırmaktır. Ancak ek bağımsız değişkenler olmadan, yalnızca komutu değiştirilmemiş bir ortamda çalıştırır, bu durumda ihtiyacınız olan tek şey budur.
Bu yaklaşımın bazı dezavantajları vardır. Modern Unix benzeri sistemlerin çoğunda var /usr/bin/env, ancak envkomutun farklı bir dizine kurulduğu eski sistemler üzerinde çalıştım . Bu mekanizmayı kullanarak geçebileceğiniz ek argümanlarda sınırlamalar olabilir. Kullanıcı ,node içinde komutu içeren dizine sahip değilse$PATH veya başka bir komut çağrılmışsa node, yanlış komutu çalıştırabilir veya hiç çalışmayabilir.
Diğer yaklaşımlar şunlardır:
- Komut dosyasını farklı sistemler için gerektiği gibi güncelleyerek komutun kendisine
#!giden tam yolu belirten bir satır kullanın node; veya
- Çağırmak
nodebağımsız değişken olarak Senaryonuzun ile komutu.
Hile hakkında daha fazla tartışma için bu soruya (ve cevabıma ) da bakın #!/usr/bin/env.
Bu arada, sistemimde (Linux Mint 17.2) /usr/bin/nodejs. Notlarıma göre, değiştirilen /usr/bin/nodeiçin /usr/bin/nodejsUbuntu 12.04 ve 12.10 arasında. #!/usr/bin/envHile ile değil bize yardım eder (bir sembolik falan benzer kurmak sürece).
GÜNCELLEME: mtraceur tarafından yapılan bir yorum şöyle diyor (yeniden biçimlendirilmiş):
Nodejs ve düğüm sorunu için bir geçici çözüm, dosyayı aşağıdaki altı satırla başlatmaktır:
#!/bin/sh -
':' /*-
test1=$(nodejs --version 2>&1) && exec nodejs "$0" "$@"
test2=$(node --version 2>&1) && exec node "$0" "$@"
exec printf '%s\n' "$test1" "$test2" 1>&2
*/
Bu önce deneyecek nodejs, sonra deneyecek nodeve hata mesajlarını yalnızca ikisi de bulunamazsa yazdıracaktır. Bir açıklama bu yorumların kapsamı dışındadır, bu cevap sorunu gündeme getirdiğinden, herhangi birinin problemle başa çıkmasına yardımcı olma ihtimaline karşı burada bırakıyorum.
Son zamanlarda NodeJS kullanmadım. Umudum olmasıdır nodejsvs nodeBen ilk bu cevabı yayınlanmıştır beri sorun yıllarda giderilmiştir. Ubuntu 18.04 tarihinde, nodejspaket yükler /usr/bin/nodejssembolik bağ olarak /usr/bin/node. Daha eski bir işletim sisteminde (Ubuntu veya Linux Mint, hangisi olduğundan emin değilim), sembolik bağlantı olarak nodejs-legacysağlanan bir paket vardı . Tüm ayrıntıları doğru bildiğimin garantisi yok.nodenodejs
node