在bash脚本中使用进程replace时,节点找不到模块

我有一个命令,我通常会运行在我的package.json scripts部分,但问题是npm run使用sh ,它不支持进程replace。

我需要进程replace,因为我想将parameter passing给flow-remove-types index.js的结果,而不能用pipe来完成。

所以我写了下面的脚本:

 #!/bin/bash PATH=./node_modules/.bin:$PATH case $1 in start) node <(flow-remove-types index.js) ${@:2} ;; works) flow-remove-types index.js | node ;; esac 

现在的问题是,当我使用进程replace时,节点无法find已安装的模块。 在运行flow-remove-types index.js | node的case语句中使用works命令运行 flow-remove-types index.js | node没有find模块的问题,但是当我运行命令start与进程replace。 我得到以下堆栈跟踪

 module.js:457 throw err; ^ Error: Cannot find module 'moment' at Function.Module._resolveFilename (module.js:455:15) at Function.Module._load (module.js:403:25) at Module.require (module.js:483:17) at require (internal/module.js:20:19) at Object.<anonymous> (/dev/fd/63:3:16) at Module._compile (module.js:556:32) at Object.Module._extensions..js (module.js:565:10) at Module.load (module.js:473:32) at tryModuleLoad (module.js:432:12) at Function.Module._load (module.js:424:3) 

有谁知道为什么发生这种情况? 为什么节点不能访问node_modules安装的模块。

我的猜测是,当你运行:

 flow-remove-types index.js | node 

那么node尝试在当前工作目录中查找node_modules目录,因为它不知道脚本的位置 – 它通过STDIN获取它。

但是当你运行:

 node <(flow-remove-types index.js) 

那么node不会在STDIN上获得脚本,而是在像/dev/fd/63类的文件中获取它的文件名作为命令行参数。

尝试这个来看看它被评估为:

 echo node <(flow-remove-types index.js) 

然后,它可能会试图find/dev/fdnode_modules目录,但它不在那里。

也许运行这样的事情会有所帮助:

 NODE_PATH=`pwd`/node_modules node <(flow-remove-types index.js) 

我无法testing它,因为对我来说运行:

 node <(cat app.js) 

即使app.js不需要任何模块也不起作用。