Обработка вывода subshell в Node.js - PullRequest
1 голос
/ 04 февраля 2012

Если я вызову системный метод в Ruby, он выполнит мою команду в подоболочке и выведет все, что сможет.Поэтому, если я помещу это в файл file.rb:

system 'vim'

и запусту $ ruby file.rb, он запустит Vim, чтобы я мог его использовать.Если я делаю то, что считал эквивалентным в Node.js, и помещаю его в file.js:

var exec = require('child_process').exec;
exec('vim');

и запускаю $ node file.js, он запускает Vim, но ничего не выводит (если я не получаю stdout издочерний процесс и вывод его сам, который не будет работать так хорошо).Как мне добиться того, что я сделал в Ruby с Node?

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Как и во многих функциях в Node, возвращаемое значение фактически не возвращается самим вызовом функции, а вместо этого передается обратному вызову, который передается как последний аргумент функции. Такая конструкция позволяет основному циклу Node выполнять другие задачи во время выполнения дочернего процесса.

Если вы просто хотите распечатать вывод stdout дочернего элемента, вы должны сделать следующее:

var exec = require('child_process').exec;

exec('vim', function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
});

Если вы также хотите вывести stderr и код завершения процесса, попробуйте это:

exec('vim', function (error, stdout, stderr) {
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    console.log('exit code:', error ? error.code : 0);
});

Также обратите внимание, что exec() - это просто удобная оболочка для spawn(), которая предлагает гораздо более мощный интерфейс и позволяет вам использовать потоки для stdin, stdout и stderr.

Этот пример был взят из документации узла здесь и немного изменен.

0 голосов
/ 04 февраля 2012

Вы можете сделать это, используя node-ffi , как показано в примере здесь: https://stackoverflow.com/a/6288426/288425

Просто замените echo $USER на vim, и вы получите интерактивный сеанс vim.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...