【问题标题】:Node-Webkit Child Process ExecNode-Webkit 子进程执行
【发布时间】:2014-10-01 23:43:08
【问题描述】:

例如我想执行一个自制命令

brew list

我按照文档执行,如下所示:

child = exec('brew', function (error, stdout, stderr) {
 console.log(stdout);
 console.log(stderr);
});

我收到一个未找到命令的错误,并意识到如果我将 /usr/local/bin/brew 作为命令它可以工作。然而,简单地使用“brew”应该也可以,因为我可以从命令行运行“brew”。

为什么会出现这种情况?如何让“brew”作为节点中的子进程运行?我感觉是问题的一部分,因为 node-webkit 上的命令似乎是从 bin/sh 执行的。

谢谢

【问题讨论】:

  • /usr/local/bin 在你的 $PATH 中吗?
  • 是的。是我实际验证的第一件事!

标签: node.js node-webkit


【解决方案1】:

这可能取决于您如何启动 node-webkit 以及您如何设置PATH。当我从命令行启动时,它会从我的命令行环境中继承环境变量,包括PATH。如果我通过双击 gui 开始,它会从系统继承(大概是 /etc/paths),并且我在 .bashrc/.bash_profile 中添加的任何内容都无效。

另外,我不是安全专家,但我对最佳实践的理解包括使用您正在运行的可执行文件的绝对路径,因此通过设置环境变量来进行欺骗更难。按照这个标准,你最好还是使用brew 的完整路径。

【讨论】:

  • 谢谢,从命令行启动和双击确实是有区别的。问题是如果我可以简单地双击应用程序显然会更好。关于我如何实现这一目标的任何见解?
  • 嗯,这取决于您要达到的目标。您的意思是您需要访问 brew 吗?你怎么知道你的用户已经安装了 brew?
  • 根据您的回答,我是从命令行启动的,它运行良好。只是当我通过双击启动时,环境变量似乎丢失了。我还安装了 brew 作为我的应用程序的一部分。
  • 啊,我明白了。然后我会使用完整的绝对路径来酿造,它应该在任何一种情况下都可以工作。由于您将 brew 作为应用程序的一部分安装,因此我假设您可以确定它的安装位置。
  • 有问题。让我们假设 brew 调用另一个命令(如 my-command),该命令可能由您的 .bash_profile 文件或其他东西设置在 PATH 中。然后 brew 命令将失败,因为它找不到 my-command。使用 brew 的绝对路径并不能解决这个问题。唯一的选择是在调用 exec 时传递带有 env 选项的 PATH 变量。
猜你喜欢
  • 1970-01-01
  • 2015-09-12
  • 2014-09-22
  • 2013-11-09
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
相关资源
最近更新 更多