Я пытаюсь запустить команду оболочки из Node.js, не перенаправляя ввод и вывод этой команды - так же, как обход команды с помощью оболочки script или с помощью команды 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 и т.д.