我最近偶然发现一个错误,该错误由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
,即使我在.bashrc
行export MY_OWN_VARIABLE="foo bar baz"
中添加了它也找不到它。
(出于测试目的,我以root用户身份在VM中工作,所以我更改了根bashrc)。
似乎exec()
在生成shell时没有使用bashrc,但是它仍然找到了一些变量,例如$PATH
,但不是我定义的变量,我也不知道为什么。
这仅仅是出于好奇,上面链接的解决方案解决了我的问题,但仍然困扰着我。
注意:我对节点不熟悉,可能对bash shell的创建方式也不熟悉。
答案 0 :(得分:1)
尝试重新启动根会话,并检查$MY_OWN_VARIABLE
是否设置为echo $MY_OWN_VARIABLE
。可能只需要重新启动会话即可。