nodejs exec()函数如何加载bash环境?

时间:2019-03-04 17:01:20

标签: node.js bash exec

我最近偶然发现一个错误,该错误由exec()函数启动的进程失败,因为它找不到环境变量。

我找到了关于here的解决方案,但现在有一个问题。

exec()中的child_process函数会加载哪个bash环境? (不确定问题是否写得好,所以我会再解释一下。)

// app.js
const {exec} = require('child_process');
const http = require('http');

// Create an instance of the http server to handle HTTP requests
let app = http.createServer((req, res) => {
    // Set a response type of plain text for the response
    res.writeHead(200, {'Content-Type': 'text/plain'});

    exec('echo $PATH > foo.txt');   // <<<<<<<<

    // Send back a response and end the connection
    res.end('Hello World!\n');
});

// Start the server on port 3000
app.listen(3000, '127.0.0.1');
console.log('Node server running on port 3000');

如果运行上面的代码,则会得到一个foo.txt文件,其中包含$PATH的内容,这意味着exec()产生的shell环境可以找到环境变量。

但是,即使我尝试将$PATH更改为$MY_OWN_VARIABLE,即使我在.bashrcexport MY_OWN_VARIABLE="foo bar baz"中添加了它也找不到它。

(出于测试目的,我以root用户身份在VM中工作,所以我更改了根bashrc)。

似乎exec()在生成shell时没有使用bashrc,但是它仍然找到了一些变量,例如$PATH,但不是我定义的变量,我也不知道为什么。

这仅仅是出于好奇,上面链接的解决方案解决了我的问题,但仍然困扰着我。

注意:我对节点不熟悉,可能对bash shell的创建方式也不熟悉。

1 个答案:

答案 0 :(得分:1)

尝试重新启动根会话,并检查$MY_OWN_VARIABLE是否设置为echo $MY_OWN_VARIABLE。可能只需要重新启动会话即可。