2013-12-17 39 views
37

我正在嘗試爲node.js創建一個腳本,這個腳本可以在多個環境中工作。特別是對於我,我在OS X和Ubuntu之間來回切換。在前者中,節點安裝爲node,但後者爲nodejs。在我的腳本的頂部,我可以有:適用於Node.js腳本的hashbang

#!/usr/bin/env node 

#!/usr/bin/env nodejs 

我寧願腳本爲節點安裝,而不是運行的,只要這兩種環境中的可執行文件有一個或另一個必須指定命令(./script-name.jsnode script-name.js)。

有沒有什麼辦法可以指定一個備份hashbang或在node.js中兼容的備份?

+0

你可以製作一個封裝外殼腳本來調用你的腳本,它試圖找出節點在哪裏以及它叫什麼。 – Doon

+3

在Unix網站上的這個答案很多建議 - http://unix.stackexchange.com/questions/65235/universal-node-js-shebang – sargant

+0

我有一個nodejs腳本,我從'#!/ usr/bin /節點'到'#!/ usr/bin/nodejs'時,我從Ubuntu 12.04升級到12.10。它是從一個包裝檢查這兩個。關於'#!/ usr/bin/env'的討論,請參閱[這個問題](http://unix.stackexchange.com/q/29608/10454)和[我的回答](http:// unix。 stackexchange.com/questions/29608/why-is-it-better-to-use-usr-bin-env-name-instead-of-path-to-name-as-my/29620#29620)。 –

回答

63

如果你的腳本是供節點開發人員使用的,你絕對應該只使用

#!/usr/bin/env node 

又懶得與誰只具有節點安裝爲nodejs人試圖兼容性。

理由:

  • 這就是時尚的年輕人都在做的,如果你沒有做到這一點,你是不冷靜。主要節點項目如jshint,karma,bower,甚至npm僅使用#!/usr/bin/env node作爲其可執行腳本的shebang。
  • 因爲酷酷的孩子們正在這樣做,所以任何在Ubuntu上使用Node的人都會將/usr/bin/node設置爲nodejs的符號鏈接。這裏有堆棧溢出和遍佈網絡的highly-viewed instructions。甚至還有​​包,其全部用途是爲你創建這個符號鏈接。使用Node的人知道如何解決Ubuntu上的這個問題,他們必須要,如果他們想要使用幾乎任何在Node中編寫的軟件。
  • 這個問題在Ubuntu 14.04上似乎不再存在;我剛清除了節點並運行了一個apt-get install nodejs,它創建了/usr/bin/node作爲符號鏈接到/etc/alternatives/node。受這個問題困擾的人,我懷疑是少數人的縮小。

即使你的目標節點不識字的人,你可能仍然要使用#!/usr/bin/env node,或許增加了對創建符號鏈接或安裝​​包的可能需要您的安裝文件,如果你認爲有必要。需要注意的是,如果有人用nodejs但不node可嘗試與上述家當運行您的程序,他們會看到:

在/ usr/bin中/ ENV:節點:沒有這樣的文件或目錄

Googling that將爲他們提供第一個結果中的修復和第一個頁面中的多次修復。

如果你真的,拼命想確保用戶可以在系統中nodejs可用,但node不是(或者node實際上是Amateur Packet Radio Node program),那麼你可以使用這個「兩行上運行軟件認領」從Unix & Linux Stack Exchange採取:

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

console.log('Hello world!'); 

但你真的需要做到這一點的時候,幾乎沒有人在世界上的節點是?

+1

如果支持'nodejs'可執行文件是首選的,你可能會發現使用'#!/ bin/sh'和'/ bin/false ||'來使用shebang稍微漂亮些。 exec「$(command -v nodejs || command -v node)」「$ 0」'。 – lennartcl

相關問題