发送相同的bash进程多个命令

时间:2018-03-26 20:03:53

标签: 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进程,并为我运行的每个命令获取stdout。有没有办法做到这一点,还是我需要为我运行的每个命令启动一个新的bash进程?

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

2 个答案:

答案 0 :(得分:1)

我不认为你可以在bash调用后保持bash进程活着,然后通过一些新的调用重新进入进程。但是,您可以在同一进程中相继运行多个bash命令,例如用分号分隔它们:

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

答案 1 :(得分:0)

这个 article 表明现在有一个 NPM 包,允许持久的 bash 进程。

github 网址:

https://github.com/bitsofinfo/stateful-process-command-proxy

引自他主页:

<块引用>

此节点模块可用于代理长寿命的 bash 进程、windows 控制台等。它可以在运行最新版本节点的 linux、os-x 和 windows 主机上运行并经过测试。