Javascript 从JS中寻找shell脚本

Javascript 从JS中寻找shell脚本,javascript,node.js,shell,Javascript,Node.js,Shell,假设我们有一个包含以下内容的env.sh export SOME_VAL="abcd" 我们想从JS(node.JS)脚本bootstrap.JS中获取这个shell脚本的源代码 const childProcess = require('child_process'); const cmd = '. ' + pathToEnvScript; childProcess.exec(cmd, (err, stdout, stderr) => { if (err) console.er

假设我们有一个包含以下内容的
env.sh

export SOME_VAL="abcd"
我们想从JS(node.JS)脚本
bootstrap.JS
中获取这个shell脚本的源代码

const childProcess = require('child_process');
const cmd = '. ' + pathToEnvScript;
childProcess.exec(cmd, (err, stdout, stderr) => {
    if (err) console.error(err);
    console.log(stdout);
})
echo $SOME_VAL # empty
node bootstrap.js
echo $SOME_VAL # empty
下面是我们如何调用
bootstrap.js

const childProcess = require('child_process');
const cmd = '. ' + pathToEnvScript;
childProcess.exec(cmd, (err, stdout, stderr) => {
    if (err) console.error(err);
    console.log(stdout);
})
echo $SOME_VAL # empty
node bootstrap.js
echo $SOME_VAL # empty

为什么采购不起作用?如果我们从终端调用
source env.sh
,则源代码是有效的,但对于
节点bootstrap.js
childProcess.exec(command)
使用
export
使变量可用于shell的子进程,但不可用于其父进程。节点和从中调用节点的shell永远看不到变量。

这至少有两个原因不起作用
source
是一个,默认情况下,节点生成
/bin/sh
。即使您让
child\u process.exec
生成Bash shell:

const childProcess = require('child_process');
const cmd = '. ' + pathToEnvScript;
childProcess.exec(cmd, (err, stdout, stderr) => {
    if (err) console.error(err);
    console.log(stdout);
})
echo $SOME_VAL # empty
node bootstrap.js
echo $SOME_VAL # empty
child_process.exec(“ls”{shell:/bin/bash”},(err,stdout)=>())

然后将
源变量添加到shell进程的环境中,而不是node.js的环境中

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

子进程无法修改其父环境(除非您破解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

为什么要使用nodejs来编写shell脚本??我想您需要导出子范围之外的变量。受某些项目要求的限制。我很好奇。给了你一个选择,希望对你有帮助。我需要更多关于你的要求的细节来解决这个明显不可行的问题。这也是我的第一个想法。但是,源脚本可能会计算变量。因此,对my_var=“abc”
进行基本的解析可能不太管用。