假设有一个变量key1
,其值为123
key1=123
因此,当我在Linux环境echo $key1
中运行命令时,输出为123
。
现在我有以下任务。
const child_process = require('child_process');
....
gulp.task('printKeyValue', function() {
var value1 = child_process.execSync('echo $key1');
console.log(value1.toString().trim());
});
在这里,我正在尝试使用Child Process
从nodejs访问linux变量的值。但是当我运行以下gulp任务时,我没有得到所需的输出。
npm run gulp -- printKeyValue
相反,我得到的输出为$key1
,而不是123
。
请参见下面的屏幕截图
gulp任务中的其他命令,例如ls
和pwd
提供所需的输出。
有人可以帮忙这个问题还是建议另一种方法?
答案 0 :(得分:5)
您没有导出变量。当你做
key1=123
该变量不会传播到子流程。它会在您当前的bash
进程中可用,因此您在键入echo $key1
时可以看到它,但不会被node
进程继承。正如man bash
所说:
当要执行除内置函数或shell函数以外的简单命令时,将在包含以下内容的单独执行环境中调用该命令。除非另有说明,否则这些值是从Shell继承的。
[...]
标记为导出的shell变量和函数,以及为命令导出的变量,已在环境中传递
您需要将变量定义为已导出
export key1=123
或将现有变量标记为要导出
key1=123
export key1
或通过bash固有功能在修改后的环境中启动节点
key1=123 node code.js
或使用/usr/bin/env
实用程序:
env key1=123 node code.js
将变量正确地传递到节点进程后,它将在process.env.key1
和子进程$key1
中都可用。
编辑:我刚刚注意到,您实际上给出了您正在运行的命令;没关系,node
或npm
或其他任何可执行文件都采用相同的逻辑。