Недавно я наткнулся на ошибку, когда произошел сбой процесса, запущенного функцией exec()
, так как не удалось найти переменную среды.
Я нашел решение здесь на SO, но ятеперь есть вопрос.
В какой среде bash загружается exec()
из child_process
?(не уверен, что вопрос хорошо написан, поэтому я объясню немного подробнее.)
// 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()
, может найти переменные среды.
Однако, если я пытаюсь изменить $PATH
на $MY_OWN_VARIABLE
, он не может найти его, даже если я добавил в .bashrc
строку export MY_OWN_VARIABLE="foo bar baz"
.
(В целях тестирования я работаю на виртуальной машине как root, поэтому я изменил корневой bashrc).
Похоже, что exec()
не использует bashrc при порожденииshell, но он по-прежнему находит некоторые переменные, такие как $PATH
, но не те, которые я определил, и я не знаю, почему.
Это только чистое любопытство, решение, указанное выше, решило мою проблему, но все еще беспокоит меня.
Примечание: я не знаком с узлом и, вероятно, не знаю, как создается оболочка bash.