在NodeJS进程中创建bash包装器

时间:2015-02-12 14:02:17

标签: linux node.js bash shell pty

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

我尝试使用pty.jsstdin流程bash,以及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();
});

这很有效,但它非常错误:

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

我也尝试过使用spawn,这并不是那么糟糕,但仍然是错误的。

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

var bash = spawn("bash");
bash.stdout.pipe(process.stdout);
process.stdin.pipe(bash.stdin);

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

1 个答案:

答案 0 :(得分:4)

您可能希望将标准输入放入raw mode。这样,所有击键都将被报告为数据事件。否则,您只能获得行(每次按下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();
});

也许您还可以在related question中找到其他人的更多经验。

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