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 node
komut yüklü değilse bu çalışmaz /usr/bin
.
Yaygın bir çözüm, env
komutu 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
env
Komut, 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 env
arayacak olmasıdır $PATH
. Yani eğer node
yüklenir /usr/local/bin/node
ve sahip /usr/local/bin
Gözlerinde farklı $PATH
, env
komut çağıracağı /usr/local/bin/node foo
.
env
Komutun 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 env
komutun 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
node
bağı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/node
için /usr/bin/nodejs
Ubuntu 12.04 ve 12.10 arasında. #!/usr/bin/env
Hile 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 node
ve 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 nodejs
vs node
Ben ilk bu cevabı yayınlanmıştır beri sorun yıllarda giderilmiştir. Ubuntu 18.04 tarihinde, nodejs
paket yükler /usr/bin/nodejs
sembolik 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-legacy
sağlanan bir paket vardı . Tüm ayrıntıları doğru bildiğimin garantisi yok.node
nodejs
node