从Node.js中设置全局环境变量

时间:2015-09-11 12:03:58

标签: node.js bash spawn env

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

目标是:

  1. 重新启动APP时,仍应设置环境变量
  2. 打开新shell时,它应该可用
  3. 如果可能:重启时,与1相同。
  4. 它应该适用于Linux,Mac OS X(并且需要一个替代的Windows命令)
  5. 这是我做的:

    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

3 个答案:

答案 0 :(得分:3)

export不是一个独立的命令,而是一个内置的shell,它为当前shell进程设置环境变量,并在设置它们之后对其子进行分叉。

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

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

中进行设置

答案 1 :(得分:3)

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

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

process.env.YOUR_VAR = 'your_value';

答案 2 :(得分:2)

尝试一下:

<强> https://www.npmjs.com/package/shelljs

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

示例代码:

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