我目前正在处理pm2 ,NodeJS 的流程管理器。
由于它是针对 Javascript 的,因此一个新标准即将到来,ES6。
要在 NodeJS 上启用它,我必须添加选项 --harmony
。
现在对于 bash 部分,我必须让用户将此选项传递给执行该文件的解释器。通过爬行网络(并在 Stackoverflow 上找到)我发现了这个:
#!/bin/sh
':' //; exec "`command -v nodejs || command -v node`" $PM2_NODE_OPTIONS "$0" "$@"
看起来是一个不错的技巧,但是它是否足够便携?在 CentOS、FreeBSD 上...
这很关键,所以我想确定一下。
谢谢
最佳答案
让我们分解一下兴趣线。
:
在 shell 中不执行任何操作。
;
是命令分隔符。
exec
将用它正在执行的命令的进程替换当前进程。
请注意,在 exec 命令中,它将 "$0"
和 "$@"
作为参数传递给命令?
这将允许新进程读取由 $0
表示的脚本并将其用作脚本输入并读取原始参数 $@
新进程将从头开始读取输入脚本并忽略诸如#!/bin/sh
之类的注释。并且还会忽略 :
。
这就是窍门。大多数解释器(包括 perl)使用 shell 忽略的语法,反之亦然,因此在重新读取输入文件时,解释器不会再次执行自身。
在这种情况下,新进程忽略了 :
中的整行。为什么该行的其余部分被忽略?在某些 C 语言(如解释器)上,//
是注释。
我忘了回答你的问题了。是的,它看起来很便携。可能存在极端情况,但我现在想不到。
关于node.js - 令我害怕的 sh 线,它便携吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126385/