2014-01-14 24 views
2

我目前正在致力於NodeJS的流程管理器pm2讓我感到害怕的sh線是便攜式嗎?

因爲它的目標是使用Javascript,新的標準即將到來,ES6。 要在NodeJS上啓用它,我必須添加選項--harmony

現在對於bash部分,我必須讓用戶將此選項傳遞給執行文件的解釋器。通過抓取網頁(和#2中),我發現這一點:

#!/bin/sh 

':' //; exec "`command -v nodejs || command -v node`" $PM2_NODE_OPTIONS "$0" "[email protected]" 

bin line

看起來像一個不錯的技巧,但它是便攜式就夠了嗎?在CentOS上,FreeBSD ...

這很關鍵,所以我想確定一下。

謝謝

回答

3

讓我們打破的利益就行了。

:是一個無所事事的貝殼。

;是一個命令分隔符。

exec將用它正在執行的命令的進程替換當前進程。

請注意,在exec命令中,它將"$0""[email protected]"作爲參數傳遞給命令?

這將允許新的進程讀取由$0表示的腳本,並把它作爲一個腳本的輸入和讀取原始參數以及[email protected]

新進程將開始讀取輸入腳本,並忽略評論,如#!/bin/sh。並且也將忽略:

這是訣竅。大多數解釋器(包括perl)都使用被shell忽略的語法,反之亦然,因此在重新讀取輸入文件時,解釋器不會再執行自身。

在這種情況下,新進程忽略了從:開始的整行。該行其餘部分被忽略的原因?在一些C口譯員,//是一個評論。

我忘了回答你的問題。是的,它似乎便攜。可能會出現角落案件,但我現在無法想象。

+0

該死的這是非常聰明的黑客攻擊。謝謝你的解釋! – Unitech

+0

在此處添加了它:https://github.com/Unitech/pm2/blob/development/bin/pm2#L3 – Unitech

1

要在NodeJS上啓用它,我必須添加--harmony選項。

不一定。您可以使用普通的「#!/ usr/bin/env節點」shebang,但在運行時使用setflags模塊設置和聲標誌。

我不確定這是更好的解決方案,但值得一提。

+0

不知道這個模塊,很高興知道我的nodejs工具箱:D謝謝! – Unitech