简体   繁体   English

从Shell脚本中运行已安装的节点程序

[英]Run installed node program from within a shell script

I have used nvm to setup a specific node version, 我已经使用nvm设置了特定的节点版本,

nvm install 9.11.1

I have a nodejs program built and installed: 我已经构建并安装了一个nodejs程序:

npm install -g osmlint

This is the full path of the newly minted executable: 这是新创建的可执行文件的完整路径:

which osmlint
/root/.nvm/versions/node/v9.11.1/bin/osmlint

I run it with the following command: 我使用以下命令运行它:

/root/.nvm/versions/node/v9.11.1/bin/osmlint crossingbuildings --bbox="[72.9,18.8,73,18.9]" --zoom=12 india.mbtiles > test.txt

And it works fine. 而且效果很好。

I've put the same in a bash shell script. 我已经在bash shell脚本中添加了相同的内容。 (say, run1.sh ). (例如, run1.sh )。 But when I run the shell script, it errors out. 但是,当我运行shell脚本时,它会出错。

internal/modules/cjs/loader.js:775
    throw err;
    ^

Error: Cannot find module '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/sqlite3/lib/binding/node-v72-linux-x64/node_sqlite3.node'
Require stack:
- /root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/sqlite3/lib/sqlite3.js
- /root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/@mapbox/mbtiles/lib/mbtiles.js
- /root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/src/index.js
- /root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/validators/crossingBuildings/index.js
- /root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/cli.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:772:15)
    at Function.Module._load (internal/modules/cjs/loader.js:677:27)
    at Module.require (internal/modules/cjs/loader.js:830:19)
    at require (internal/modules/cjs/helpers.js:68:18)
    at Object.<anonymous> (/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/sqlite3/lib/sqlite3.js:4:15)
    at Module._compile (internal/modules/cjs/loader.js:936:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10)
    at Module.load (internal/modules/cjs/loader.js:790:32)
    at Function.Module._load (internal/modules/cjs/loader.js:703:12)
    at Module.require (internal/modules/cjs/loader.js:830:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/sqlite3/lib/sqlite3.js',
    '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/node_modules/@mapbox/mbtiles/lib/mbtiles.js',
    '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/node_modules/@mapbox/tile-reduce/src/index.js',
    '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/validators/crossingBuildings/index.js',
    '/root/.nvm/versions/node/v9.11.1/lib/node_modules/osmlint/cli.js'
  ]
}

Apparently the same node environment isn't in effect inside the shell script's bash environment. 显然,相同的节点环境在shell脚本的bash环境中无效。 How do we make this work? 我们如何做这项工作?

To run the node executable from shell script, we need to set the node environment. 要从shell脚本运行节点可执行文件,我们需要设置节点环境。

nvm use 9.11.1

But even nvm is unknown to the bash environment of the shell script. 但是,即使nvm对于Shell脚本的bash环境也是未知的。 So, need to set that up. 因此,需要进行设置。

source /root/.nvm/nvm.sh

Combined commands: 组合命令:

# required : initialize nvm, then make it set the current node version to v9.11.1
source /root/.nvm/nvm.sh
nvm use 9.11.1
# run osmlint. # mention full path of executable.
/root/.nvm/versions/node/v9.11.1/bin/osmlint crossingbuildings --bbox="[72.9,18.8,73,18.9]" --zoom=12 india.mbtiles > test.txt

..and that worked. ..并且有效。 Sharing this in case others like me get stuck with having to run a node program from inside a shell script. 如果像我这样的其他人因不得不从shell脚本中运行节点程序而陷入困境,请分享这些信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM