在 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 会话,知道命令何时完成,并读取和修改源/导出的变量的主要内容,如果未能解决你的问题,请参考以下文章