electron 中通过子进程 echo $PATH,或者 process.env.PATH 得到的路径都是不完整的

发布于 2022-09-11 21:12:18 字数 561 浏览 14 评论 0

$PATH 实际内容相如下

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/xxxx/.npm-global/lib/node_modules/http-server/bin:/Users/xxx/.npm-global/lib/node_modules/serve/bin

或者

/Users/xxxx/.nvm/versions/node/v8.11.1/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/mongodb/bin

但是在 electron 应用 内通过 execSync(echo $PATH).toString() 或者 process.env.PATH 获取 就只有 /usr/bin:/bin:/usr/sbin:/sbin

这导致部分命令无法应用内执行。
有什么方法可以获取 $PATH 的完全体吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半寸时光 2022-09-18 21:12:18

解决了。
这个事情导致的问题是--我在应用内使用 execSync() 之类的方法执行部分命令会提示 command not found :xx,
原因目前有两个,一是 app 内获取的环境变量(process.env.PATH)和系统环境变量不一致,解决方案是在执行 execSync 这类方法时,options 设置

env: {
        PATH: execSync(`echo $PATH`)
          .toString()
          .slice(0, -1),
     }

第二个原因是使用了 nvm 做 node 的版本管理,nvm 会更新 $PATH,可以在执行具体命令前 先如下操作:

const home = execSync(`echo $HOME`).toString().slice(0, -1);
execSync(`source ${path.join(home, '.nvm/nvm.sh')}`)

后续:
第二个 nvm 的方式需要改成在 使用他的进程内执行

ptyProcess = pty.spawn(shell, [], {
      name: 'xterm-color',
      cols: 100,
      rows: 40,
      cwd,
      env: {
        PATH: '/usr/local/bin:' + execSync(`echo $PATH`)
          .toString()
          .slice(0, -1),
        HOME: execSync(`echo $HOME`)
          .toString()
          .slice(0, -1),
      },
    });
ptyProcess.write(`source ${path.join(home, '.nvm/nvm.sh')} \r`, 'utf8');
方圜几里 2022-09-18 21:12:18

这是我本地在渲染进程中打印的process.env.PATH.split(require('path').delimiter)

clipboard.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文