Запуск команды оболочки из Node.js без буферизации вывода

Я пытаюсь запустить команду оболочки из Node.js, без перенаправления ввода и вывода этой команды --, точно так же, как обливание команды с помощью сценария оболочки, или с помощью команды Ruby system. Если дочерний процесс хочет записать в STDOUT, я хочу, чтобы он шел прямо в консоль (или был перенаправлен, если вывод моего приложения Node был перенаправлен ).

У Node, похоже, нет простого способа сделать это. Похоже, что единственный способ запустить другой процесс — это child_process, который всегда перенаправляет ввод и вывод дочернего процесса в каналы. Я могу написать код для приема данных из этих каналов и записи их в STDOUT и STDERR моего процесса, но если я это сделаю, API заставят меня пожертвовать некоторой гибкостью.

Мне нужны две функции.:

  • Синтаксис оболочки. Я хочу иметь возможность направлять вывод между командами или запускать пакетные файлы Windows.
  • Неограниченный выход. Если я обращаюсь к компилятору, и он хочет сгенерировать мегабайты предупреждений компилятора, я хочу, чтобы все они прокручивались по экрану (, пока пользователю это не надоест и он не нажмет Ctrl+C).

Похоже, Node хочет заставить меня выбирать между этими двумя функциями.

  • Если мне нужен неограниченный объем вывода, я могу использовать child_process.spawn, а затем выполнить child.stdout.on('data', function(data) { process.stdout.write(data); });и то же самое для stderr, и он с радостью будет передавать данные по конвейеру, пока коровы не вернутся домой. К сожалению, spawnне поддерживает синтаксис оболочки.
  • Если мне нужен синтаксис оболочки, я могу использовать child_process.exec. Но execнастаивает на буферизации STDOUT и STDERR дочернего процесса для меня и предоставлении их мне в конце, и он ограничивает размер этих буферов (настраиваемым, 200 КБ по умолчанию). Я все еще могу зацепить события on('data'),если я хочу видеть вывод в том виде, в котором он был сгенерирован, но execтакже будет добавлять данные в свои буферы. Когда объем данных превысит предопределенный размер буфера, execзавершит дочерний процесс.

(Существует такжеchild_process.execFile, который является худшим из обоих миров с точки зрения гибкости:без синтаксиса оболочки, но вы все равно должны ограничивать ожидаемый объем вывода.)

Я что-то пропустил? Есть ли способ просто передать дочерний процесс в Node и не перенаправлять его ввод и вывод? Что-то, что поддерживает синтаксис оболочки и не вылетает после предопределенного объема вывода, как это доступно в сценариях оболочки, Ruby и т. д.?

53
задан Joe White 19 March 2012 в 09:13
поделиться