这是不可能的。这不是节点的问题,甚至在其他语言中也不可能。如果子进程可以修改其父进程的环境变量,那将是一个巨大的安全问题。
export
在 bash 进程本身中工作的唯一原因是你通过“源”它们在 bash 进程中运行这些脚本,因此它正在修改自己的环境变量。
示例
#!/bin/sh
export FOOBAR=Testing
$ ./test.sh
echo $FOOBAR
没有输出任何内容,因为test.js
在它自己的进程中运行。
$ source test.sh
echo $FOOBAR
在这种情况下,test.sh被当前的bash进程本身读取和处理,因此输出'Testing'。
你真正能做的最好的事情是导出一个shell脚本,然后让shell执行它。
const key = 'FOOBAR';
const value = `hello world: ${(new Date()).toString()}`;
console.log(`export "${key}"="${value}"`)
node example.js | source /dev/stdin
echo $FOOBAR
当然,输出的结果是针对你当前使用的shell而言的,这意味着如果你切换了shell,你需要输出的内容也会改变。这也不是一种常规的方法。
更常见的方法可能是仅从node中输出值。
run x
run y
$APP_VERSION=`node -e "console.log(require('./version.js').version())"`
echo "APP_VERSION=$APP_VERSION"