Я пытаюсь запустить команду оболочки из Node.js, без перенаправления ввода и вывода этой команды --, точно так же, как обливание команды с помощью сценария оболочки, или с помощью команды Ruby system
. Если дочерний процесс хочет записать в STDOUT, я хочу, чтобы он шел прямо в консоль (или был перенаправлен, если вывод моего приложения Node был перенаправлен ).
У Node, похоже, нет простого способа сделать это. Похоже, что единственный способ запустить другой процесс — это child_process
, который всегда перенаправляет ввод и вывод дочернего процесса в каналы. Я могу написать код для приема данных из этих каналов и записи их в STDOUT и STDERR моего процесса, но если я это сделаю, API заставят меня пожертвовать некоторой гибкостью.
Мне нужны две функции.:
Похоже, 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 и т. д.?