【问题标题】:Set global environment variable out of Node.js从 Node.js 中设置全局环境变量
【发布时间】:2015-12-07 23:50:23
【问题描述】:

我正在尝试从我的 node.js 应用程序中设置一个全局环境变量。

目标是:

  1. 重启APP时,环境变量还是要设置的
  2. 当打开一个新的 shell 时,它应该是可用的
  3. 如果可能:重启时,同1。
  4. 它应该可以在 Linux、Mac OS X 上运行(并且需要 Windows 的备用 SET 命令)

这是我所做的:

var setEnv = require('child_process')
        .spawn('export GLOBALVARNAME='+my.value,{
          stdio: 'inherit',
          env: process.env
        });

但这会导致

{ [Error: spawn export GLOBALVARNAME=foobar ENOENT]
  code: 'ENOENT',
  errno: 'ENOENT',
  syscall: 'spawn export GLOBALVARNAME=foobar',
  path: 'export GLOBALVARNAME=foobar',
  spawnargs: [] }

我没有在 Windows 上对此进行测试,但在 Mac OS X(和 Linux)上,bash 上的正确命令是 export GLOBALVARNAME=value。对于 Windows,正确的命令应该是 SET GLOBALVARNAME=value - 不是吗?

所以主要问题是:手动工作 export GLOBALVARNAME=foobar 出了什么问题?

【问题讨论】:

标签: node.js bash spawn env


【解决方案1】:

正如其他答案所指出的,炮击和更改环境变量基本上是NO-OP。您想要更改当前进程及其子进程的环境,或者想要更改新进程的环境。正如@Hmlth 所说,编辑/etc/profile 将对任何新进程进行更改。

如果您想更改当前流程的环境,这很简单:

process.env.YOUR_VAR = 'your_value';

【讨论】:

    【解决方案2】:

    试试看:

    https://www.npmjs.com/package/shelljs

    我认为子进程不可能改变父进程的环境。所以我真的不认为可以使用child_process

    示例代码:

    var shell = require('shelljs');
    shell.exec('export ENV_VARIABLE=ABRACADABRA');
    

    【讨论】:

    • 你是对的,使用 child_process 不起作用。思想导出使事情变得全球化,其效果与父外壳无关......
    • 它也不能在 Windows 中工作。 shelljs 的主要目标是多平台
    【解决方案3】:

    export 不是一个独立的命令,而是一个内置的 shell,它为当前 shell 进程及其子进程设置环境变量。

    您不能为不是当前进程后代的进程设置环境变量。而在Linux下,是没有系统环境变量这种东西的。

    在 Linux 下,您的变量应该在生成您的应用程序的初始化脚本或 systemd 单元中设置。如果您希望它在交互式用户 shell 中可用,则应将其设置为 /etc/profile/etc/profile.d

    .

    【讨论】:

    • 我认为这是一个独立的命令......这很糟糕。所以我需要打开一个文件并写入它。妈的……
    • stackoverflow.com/questions/4870328/… 展示了如何访问您的环境而无需脱壳。它也适用于写入。
    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2013-11-10
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多