我试图设置一个全局环境变量出我的node.js应用程序。
目标是:
- 重新启动APP时,仍应设置环境变量
- 当打开一个新的shell时,它应该是可用的
- 如果可能:重新启动时,与1. 相同。
- 它应该在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
出了什么问题?
正如其他答案所指出的那样,剥离和更改环境变量基本上是不允许的。您要么想为当前流程及其子流程更改环境,要么想为新流程更改环境。编辑/etc/profile
将对任何新进程进行更改,如@Hmlth所示。
如果你想改变当前进程的环境,这是直接的:
process.env.YOUR_VAR = 'your_value';
export
不是一个独立的命令,而是一个shell内置命令,用于为当前shell进程及其分支的子进程设置环境变量。
不能为非当前进程的后代进程设置环境变量。在Linux下,没有系统环境变量这回事。
在Linux下,变量应该在生成应用程序的初始化脚本或systemd单元中设置。如果您希望它在交互式用户shell中可用,则应该在/etc/profile
或/etc/profile.d
.
试一试:
https://www.npmjs.com/package/shelljs
我认为子进程不可能改变父进程的进程环境。所以我真的不认为使用child_process
是可能的。
示例代码:
var shell = require('shelljs');
shell.exec('export ENV_VARIABLE=ABRACADABRA');