如果我直接在终端中运行命令(psql),它就可以工作。但如果我这样做
childProcess.exec('psql ...')
,则会在 OSX 上导致“/bin/sh: psql: command not find”。两者都适用于 Linux 的 Windows 子系统。
我尝试了
whereis psql
并将其添加到 PATH,然后 console.log(process.env.PATH)
和 childProcess.exec('echo $PATH')
都包含 psql 目录,但我仍然得到“命令未找到”。如果我这样做childProcess.exec('/opt/homebrew/bin/psql ...')
,它就可以工作,但我不能只是硬编码每个命令的路径。
这是怎么回事?我该如何解决?
childProcess.exec
是否忽略 OSX 上的 PATH?
我是新来的,正在努力发挥作用。我认为这可能是问题和解决方案:
该问题可能是由于 macOS 上 Node.js 生成的子进程未正确设置 PATH 环境变量。
第 1 步:使用 childProcess.exec 生成子进程时显式设置 PATH 环境变量。
第 2 步:将具有包含 PATH 变量的 env 属性的对象传递给 childProcess.exec。
const childProcess = require('child_process');
const command = 'psql ...'; // Your psql command here
const options = {
env: {
PATH: process.env.PATH // Include the existing PATH variable
}
};
childProcess.exec(command, options, (error, stdout, stderr) => {
if (error) {
console.error(`Error executing command: ${error}`);
return;
}
console.log(`Command output: ${stdout}`);
});
在代码片段中,我通过将子进程的 PATH 环境变量包含在选项对象的 env 属性中来设置它。
这可确保生成的子进程可以访问与终端环境相同的 PATH 设置,从而使其能够成功查找并执行 psql 命令。