node.js - 向同一个 bash 进程发送多个命令

标签 node.js bash shell

我有以下代码:

const cp = require('child_process');

function spawnInstance () {
  const c = cp.spawn('bash');
  return command => {
    return new Promise((resolve, reject) => {
      c.stdout.on('data', d => resolve(String(d || 'empty stdout.\n')));
      c.stderr.once('data', d => reject(String(d || 'empty stderr.\n')));
      c.stdin.write(`echo "${command}" | bash;`);  
      c.stdin.write('\n');
    });
  };
}

(async () => {
  const bash = spawnInstance();
  console.log(await bash('ls'));
  console.log(await bash('cd node_modules'));
  console.log(await bash('ls'));
})()
.catch(e =>
  console.error(e)
);

我想要做的是重用相同的 bash 进程,并获取我运行的每个命令的标准输出。有没有办法做到这一点,或者我需要为我运行的每个命令启动一个新的 bash 进程?

问题是我的代码卡在 cd node_modules 命令上。

最佳答案

我不认为你可以在 bash 调用之后保持 bash 进程处于事件状态,然后通过一些新的调用重新进入该进程。但是,您可以在同一进程中依次运行多个 bash 命令,例如用分号分隔它们:

console.log(await bash('cd node_modules; ls'));

关于node.js - 向同一个 bash 进程发送多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49499732/

相关文章:

javascript - 在 Node.js 中记录每个函数调用,而不进行无限递归

bash - 组合两个 grep 命令来处理来自文件的输入,或者 grep 行以一个特定的子字符串开头并在其后包含另一个

swift - 使用 awk/sed 获取 swift 函数的返回类型

linux - 如何通过命令行在多个网络连接之间进行选择?

linux - "echo"sh 和 bash 输出不同的答案

linux - 为什么指定我的 shell 会更改 root 的 EUID?

bash - 使用sshpass循环时在哪里放置<< EOF?

node.js - 如何使用 Mongoose 从另一个虚拟中访问虚拟属性

javascript - 如何使用 request.js 将文本作为请求正文发送?

node.js - 如何使用 gcloud 计算 Node js 客户端分配服务帐户?