从JS获取shell脚本

时间:2017-12-01 01:25:01

标签: javascript node.js shell

想象一下,我们有export SOME_VAL="abcd" 以下内容。

bootstrap.js

我们希望从JS(node.js)脚本const childProcess = require('child_process'); const cmd = '. ' + pathToEnvScript; childProcess.exec(cmd, (err, stdout, stderr) => { if (err) console.error(err); console.log(stdout); }) 中获取此shell脚本。

bootstrap.js

以下是我们如何调用echo $SOME_VAL # empty node bootstrap.js echo $SOME_VAL # empty

source env.sh

为什么采购不会产生任何影响?如果我们从终端拨打node bootstrap.js,但是对nv.addGraph(function() { var chart = nv.models.multiBarHorizontalChart() .x(function(d) { return d.label }) .y(function(d) { return d.value }) // .yDomain([0, parseFloat(maxY)]) .margin({top: 30, right: 20, bottom: 50, left: 175}) .showValues(false) //Show bar value next to each bar. .showControls(false); //Allow user to switch between "Grouped" and "Stacked" mode. d3.select('#bar_chart svg') .datum(sample_json()) .transition().duration(1000) .call(chart); nv.utils.windowResize(chart.update); return chart; }); 不起作用,则采购有效。

3 个答案:

答案 0 :(得分:1)

鉴于此

  

子进程无法修改其父进程(除非你破解你的shell)

你能做的最好的事情是

  

让nodejs告诉你的shell如何更新其环境,就像它自己采购脚本一样。

我假设你只对变量而不是函数感兴趣。

这是您的解决方案。

<强> bootstrap.js

const childProcess = require('child_process');
const script = process.argv[2];
childProcess.exec("env > ./1.txt; . ./"+script+" >/dev/null 2>&1; env > ./2.txt; diff 1.txt 2.txt | grep '^>'", (err, stdout, stderr) => {
    stdout.split('\n').forEach((line) => console.log(line.substr(2)));
})

以及如何调用它:

echo $SOME_VAL # empty
eval `node bootstrap.js ./file.sh`
echo $SOME_VAL # abcd

答案 1 :(得分:0)

childProcess.exec(command) spawns a shell then executes the command within that shell.使用export使变量可用于shell的子进程,但不能用于其父进程。节点和从中调用Node的shell永远不会看到变量。

答案 2 :(得分:0)

这至少有两个原因无效。 sourceBash internal command,默认情况下节点生成/bin/sh。即使你告诉child_process.exec产生一个Bash shell:

  

child_process.exec("ls", { shell: "/bin/bash" }, (err, stdout) => ())

然后source&#39; d变量将被添加到shell进程的环境中,而不是node.js的环境。

我不知道您的项目的具体要求是什么,但您最好的选择可能是在节点中打开文件并解析其内容以查找键/值对并设置节点的环境方式。