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

时间:2018-10-16 11:36:57

标签: node.js linux gulp

假设有一个变量key1,其值为123

key1=123

因此,当我在Linux环境echo $key1中运行命令时,输出为123

enter image description here

现在我有以下任务。

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

请参见下面的屏幕截图

enter image description here

gulp任务中的其他命令,例如lspwd提供所需的输出。

有人可以帮忙这个问题还是建议另一种方法?

1 个答案:

答案 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中都可用。

编辑:我刚刚注意到,您实际上给出了您正在运行的命令;没关系,nodenpm或其他任何可执行文件都采用相同的逻辑。