在 Node.js 中创建一个持久的 bash shell 会话,知道命令何时完成,并读取和修改源/导出的变量

Posted

技术标签:

【中文标题】在 Node.js 中创建一个持久的 bash shell 会话,知道命令何时完成,并读取和修改源/导出的变量【英文标题】:Create a persistent bash shell session in Node.js, know when commands finish, and read and modify sourced/exported variables 【发布时间】:2021-03-07 02:16:34 【问题描述】:

想象一下这个人为的场景:

./main.sh

source ./config.sh
SOME_CONFIG="$SOME_CONFIGbar"
./output.sh

./config.sh

export SOME_CONFIG='foo'

./output.sh

echo "Config is: $SOME_CONFIG"

我正在尝试用 Node.js 驱动的 ./main.js 替换 ./main.sh 而不替换其他 shell 文件。导出的 ./config.sh 函数/变量也必须对 ./output.sh

完全可用

这是一个不工作的 ./main.js。我写这篇文章的唯一目的是解释我希望最终代码的样子:

const terminal = require('child_process').spawn('bash')

terminal.stdin.write('source ./config.sh\n')
process.env.SOME_CONFIG = `$process.env.SOME_CONFIGbar` // this must be done in JS
terminal.stdin.write('./output.sh\n') // this must be able to access all exported functions/variables in config.sh, including the JS modified SOME_CONFIG

我怎样才能做到这一点?理想情况下,如果有一个图书馆可以做到这一点,我会更喜欢。

【问题讨论】:

unix.stackexchange.com/q/38205 如果您编辑问题以添加有关为什么需要从 JS 编辑环境的更多信息,这将有所帮助。 真正的原因是我想摆脱 shell 脚本,至少是我控制的那些。我想用JS替换它们。这个人为的例子演示了我拥有 的地方的问题。 /main.sh 但不是其他 2 个文件。我也不明白您的链接堆栈交换如何在这里提供帮助。 一个进程(node.js)不能改变另一个正在运行的进程(bash)的环境变量。我怀疑这不是真正的要求,这就是为什么您应该提供更多上下文。 【参考方案1】:

虽然这不能完全回答我的问题,但它解决了我手头的人为问题,并且可以在需要时帮助其他人。

一般来说,如果 bash 脚本通过环境变量相互通信(例如,使用 export/source),这将允许您开始将 bash 代码移动到 Node.js。

./main.js

const child_process = require("child_process");
const os = require("os");

// Source config.sh and print the environment variables including SOME_CONFIG
const sourcedConfig = child_process
  .execSync(". ./config.sh > /dev/null 2>&1 && env")
  .toString();

// Convert ALL sourced environment variables into an object
const sourcedEnvVars = sourcedConfig
  .split(os.EOL)
  .map((line) => (
    env: `$line.substr(0, line.indexOf("="))`,
    val: `$line.substr(line.indexOf("=") + 1)`,
  ))
  .reduce((envVarObject, envVarEntry) => 
    envVarObject[envVarEntry.env] = envVarEntry.val;
    return envVarObject;
  , );

// Make changes
sourcedEnvVars["SOME_CONFIG"] = `$sourcedEnvVars["SOME_CONFIG"]bar`;

// Run output.sh and pass in the environment variables we got from the previous command
child_process.execSync("./output.sh", 
  env: sourcedEnvVars,
  stdio: "inherit",
);

【讨论】:

以上是关于在 Node.js 中创建一个持久的 bash shell 会话,知道命令何时完成,并读取和修改源/导出的变量的主要内容,如果未能解决你的问题,请参考以下文章

在 node.js 的数组中创建数组?

在node.js中创建一个包含表单数据的文件[关闭]

如何使用 mongodb (node.js) 在集合中创建一个包含所有值的数组

如何在 node.js 中创建一个简单的 http 代理?

如何在 zip 文件归档器中创建文件夹 - node.js

如何在 Sequelize 中创建一个表以使用 Node JS 存储在 Postgresql 中