在 NodeJS 进程中创建一个 bash 包装器

Ion*_*zău 5 linux bash shell pty node.js

我想构建一个正在运行的小脚本,它应该创建一个类似 bash 的会话(在当前的 bash 会话中,创建进程的地方),稍后可以用于一些疯狂的科学(例如管道到浏览器)。

我尝试使用pty.js,管道stdinbash进程,以及从 bash 会话到stdout流的数据:

var pty = require("pty.js");

var term = pty.spawn('bash', [], {
  name: 'xterm-color',
  cols: process.stdout.columns,
  rows: process.stdout.rows,
  cwd: ".",
  env: process.env
});

term.pipe(process.stdout);
process.stdin.pipe(term);

term.on("close", function () {
    process.exit();
});
Run Code Online (Sandbox Code Playgroud)

这有效,但它非常有问题:

例如,不会捕获非字符(方向键、制表符等)。

我也尝试使用spawn,这还不错,但仍然有问题。

var spawn = require("child_process").spawn;

var bash = spawn("bash");
bash.stdout.pipe(process.stdout);
process.stdin.pipe(bash.stdin);
Run Code Online (Sandbox Code Playgroud)

有没有更好的解决方案如何在 NodeJS 中创建 bash 包装器?

Gab*_*vay 5

您可能希望将标准输入置于原始模式。这样所有的击键都将被报告为数据事件。否则,您只会得到行(每次按下该return键)。

process.stdin.setEncoding('utf8');
process.stdin.setRawMode(true);      

var pty = require('pty.js');

var term = pty.spawn('bash', [], {
   name: 'xterm-color',
   cols: process.stdout.columns,
   rows: process.stdout.rows,
   cwd: '.',
   env: process.env
});

term.pipe(process.stdout);
process.stdin.pipe(term);

term.on('close', function () {
    process.exit();
});
Run Code Online (Sandbox Code Playgroud)

也许您还会在此相关问题中从其他人那里找到更多经验。

PS:Vim 现在运行得更好:P