2

我目前正在研究pm2,这是 NodeJS 的流程管理器。

由于它的目标是 Javascript,一个新的标准即将到来,ES6。要在 NodeJS 上启用它,我必须添加选项--harmony.

现在对于 bash 部分,我必须让用户将此选项传递给执行文件的解释器。通过爬网(并在 Stackoverflow 上找到)我发现了这个:

#!/bin/sh

':' //; exec "`command -v nodejs || command -v node`" $PM2_NODE_OPTIONS "$0" "$@"

箱线

看起来不错,但它是否足够便携?在 CentOS、FreeBSD...

这很关键,所以我想确定一下。

谢谢

4

2 回答 2

3

让我们分解兴趣线。

:是一个无所事事的炮弹。

;是命令分隔符。

exec将用它正在执行的命令的进程替换当前进程。

请注意,在 exec 命令中它传递"$0""$@"作为命令的参数?

这将允许新进程读取由 表示的脚本$0并将其用作脚本输入并读取原始参数$@

新进程将从头开始读取输入脚本并忽略#!/bin/sh. 并且也会忽略:.

这是诀窍。大多数解释器,包括 perl,使用 shell 忽略的语法,反之亦然,因此在重新读取输入文件时,解释器不会再次执行自身。

在这种情况下,新进程忽略了从:. 忽略该行的其余部分的原因是什么?对一些 c 之类的解释器,//是一个注释。

我忘了回答你的问题。是的,它似乎是便携式的。可能有一些极端情况,但我现在想不出。

于 2014-01-15T01:17:35.690 回答
1

要在 NodeJS 上启用它,我必须添加选项 --harmony。

不必要。您可以使用普通的“#!/usr/bin/env node”shebang,但在运行时使用setflags模块设置和谐标志。

我不确定这是更好的解决方案,但值得一提。

于 2014-01-15T06:44:36.220 回答