如何从Node.js访问shell变量值?

Sid*_*rth 2 linux node.js gulp

假设有一个变量key1,它的值是123

key1=123
Run Code Online (Sandbox Code Playgroud)

所以当我在linux环境中运行命令时echo $key1,我输出为123.

在此输入图像描述

现在我有以下gulp任务.

const child_process = require('child_process');
....
gulp.task('printKeyValue', function() {
    var value1 = child_process.execSync('echo $key1');
    console.log(value1.toString().trim());
});
Run Code Online (Sandbox Code Playgroud)

在这里,我试图通过使用Child Process从nodejs访问linux变量的值

但是当我运行以下gulp任务时,我没有得到所需的输出.

npm run gulp -- printKeyValue
Run Code Online (Sandbox Code Playgroud)

相反,我得到输出,$key1而不是123.

见下面的截图

在此输入图像描述

其他命令如ls&pwdgulp task中提供了所需的输出.

有人可以帮忙解决这个问题或提出另一种方法吗?

Ama*_*dan 6

您没有导出变量.当你这么做的时候

key1=123
Run Code Online (Sandbox Code Playgroud)

变量不会传播到子进程.它将在您当前的bash进程中可用,因此您可以在键入时看到它echo $key1,但它不会被node进程继承.如上所述man bash:

当要执行除builtin或shell函数之外的简单命令时,将在由以下内容组成的单独执行环境中调用它.除非另有说明,否则值将从shell继承.

  • [...]

  • 标记为导出的shell变量和函数,以及为该命令导出的变量,在环境中传递

您需要将变量定义为已导出

export key1=123
Run Code Online (Sandbox Code Playgroud)

或标记现有变量以进行导出

key1=123
export key1
Run Code Online (Sandbox Code Playgroud)

或者通过bash先天功能启动具有修改环境的节点

key1=123 node code.js
Run Code Online (Sandbox Code Playgroud)

或使用/usr/bin/env实用程序:

env key1=123 node code.js
Run Code Online (Sandbox Code Playgroud)

将变量正确传递给节点进程后,它将在子进程中process.env.key1$key1在进程中都可用.

编辑:我刚注意到,你实际上给了你正在运行的命令; 无关紧要,每个可执行文件都有相同的逻辑,无论是否nodenpm其他任何东西.