Skrip yang akan dieksekusi oleh penerjemah biasanya memiliki baris shebang di bagian atas untuk memberi tahu OS cara menjalankannya.
Jika Anda memiliki skrip bernama fooyang baris pertamanya adalah #!/bin/sh, sistem akan membaca baris pertama itu dan menjalankan yang setara dengan /bin/sh foo. Karena itu, sebagian besar penerjemah diatur untuk menerima nama file skrip sebagai argumen baris perintah.
Nama juru bahasa setelah #!harus jalur lengkap; OS tidak akan mencari Anda $PATHuntuk menemukan juru bahasa.
Jika Anda memiliki skrip untuk dieksekusi node, cara yang jelas untuk menulis baris pertama adalah:
#!/usr/bin/node
tetapi itu tidak berfungsi jika nodeperintah tidak diinstal di /usr/bin.
Sebuah solusi umum adalah dengan menggunakan envperintah (yang tidak benar-benar dimaksudkan untuk tujuan ini):
#!/usr/bin/env node
Jika skrip Anda dipanggil foo, OS akan melakukan hal yang sama dengan
/usr/bin/env node foo
The envperintah mengeksekusi perintah lain yang namanya diberikan pada baris perintah, melewati argumen berikut untuk perintah itu. Alasan digunakan di sini adalah untuk envmencari $PATHperintah. Jadi jika nodedipasang di /usr/local/bin/node, dan Anda memiliki /usr/local/bindi Anda $PATH, yang envperintah akan memanggil/usr/local/bin/node foo .
Tujuan utama dari envperintah ini adalah untuk menjalankan perintah lain dengan lingkungan yang dimodifikasi, menambahkan atau menghapus variabel lingkungan yang ditentukan sebelum menjalankan perintah. Tetapi tanpa argumen tambahan, itu hanya menjalankan perintah dengan lingkungan yang tidak berubah, yang Anda butuhkan dalam kasus ini.
Ada beberapa kelemahan dari pendekatan ini. Sebagian besar sistem mirip Unix modern memilikinya /usr/bin/env, tetapi saya bekerja pada sistem yang lebih lama tempat envperintah dipasang di direktori yang berbeda. Mungkin ada batasan pada argumen tambahan yang dapat Anda berikan menggunakan mekanisme ini. Jika pengguna tidak memiliki direktori yang berisi nodeperintah di $PATH, atau memiliki beberapa perintah berbeda yang dipanggil node, maka ia dapat menjalankan perintah yang salah atau tidak berfungsi sama sekali.
Pendekatan lainnya adalah:
- Gunakan
#!garis yang menentukan jalur lengkap kenode perintah itu sendiri, memperbarui skrip sesuai kebutuhan untuk sistem yang berbeda; atau
- Panggil
nodeperintah dengan skrip Anda sebagai argumen.
Lihat juga pertanyaan ini (dan jawaban saya ) untuk diskusi lebih lanjut tentang #!/usr/bin/envtriknya.
Kebetulan, di sistem saya (Linux Mint 17.2), itu diinstal sebagai /usr/bin/nodejs. Menurut catatan saya, itu berubah dari /usr/bin/nodeke /usr/bin/nodejsantara Ubuntu 12.04 dan 12.10. The #!/usr/bin/envtrick tidak akan membantu dengan itu (kecuali jika Anda menyiapkan symlink atau yang serupa).
UPDATE: Komentar oleh mtraceur mengatakan (diformat ulang):
Solusi untuk masalah nodejs vs node adalah memulai file dengan enam baris berikut:
#!/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
*/
Ini pertama-tama akan mencoba nodejsdan kemudian mencoba node, dan hanya mencetak pesan kesalahan jika keduanya tidak ditemukan. Penjelasan berada di luar cakupan komentar ini, saya hanya meninggalkannya di sini jika itu membantu siapa pun mengatasi masalah karena jawaban ini memunculkan masalah.
Saya belum pernah menggunakan NodeJS belakangan ini. Harapan saya adalah bahwa masalah nodejsvs. nodetelah diselesaikan selama bertahun-tahun sejak saya pertama kali memposting jawaban ini. Di Ubuntu 18.04, nodejspaket diinstal /usr/bin/nodejssebagai symlink ke /usr/bin/node. Pada beberapa OS sebelumnya (Ubuntu atau Linux Mint, saya tidak yakin yang mana), ada nodejs-legacypaket yang disediakan nodesebagai symlink nodejs. Tidak ada jaminan bahwa saya memiliki semua detail dengan benar.
node