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

$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 的完全体吗?

阅读 5.3k
2 个回答

解决了。
这个事情导致的问题是--我在应用内使用 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');

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

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题