Мне нужно в функции node.js
result = execSync('node -v');
это будет синхронно выполнять заданную командную строку и возвращать все stdout'ed по этому тексту команды.
пс. Синхронизация неверна. Я знаю. Просто для личного пользования.
ОБНОВИТЬ
Теперь у нас есть решение mgutz, которое дает нам код выхода, но не стандартный вывод! Все еще жду более точного ответа.
ОБНОВИТЬ
mgutz обновил свой ответ и решение здесь :)
Также, как упоминалось в dgo.a , есть отдельный модуль exec-sync
ОБНОВЛЕНИЕ 2014-07-30
ShellJS lib прибыла. Считайте, что это лучший выбор на данный момент.
ОБНОВЛЕНИЕ 2015-02-10
НАКОНЕЦ! NodeJS 0.12 поддерживает execSync
изначально.
Смотрите официальные документы
Ответы:
Node.js (начиная с версии 0.12 и так далее) поддерживает
execSync
:Теперь вы можете напрямую сделать это:
и он будет делать то, что вы ожидаете. (По умолчанию направляет результаты ввода / вывода в родительский процесс). Обратите внимание, что вы можете и
spawnSync
сейчас.источник
Смотрите библиотеку execSync .
Это довольно легко сделать с помощью node-ffi . Я не рекомендовал бы для серверных процессов, но для общих утилит разработки это делает вещи. Установите библиотеку.
Пример скрипта:
[РЕДАКТИРОВАТЬ Июнь 2012: Как получить STDOUT]
источник
stdout
от этого? Все, что я могу получить, это код завершения процессаexecSync
не является частьюchild_process
. Я думаю, так и должно быть.Используйте модуль ShellJS .
Exec функция без предоставления обратного вызова.
Пример:
источник
exec()
процессор для длительных процессов.const execSync = require('child_process').execSync; code = execSync('node -v');
В node.js есть отличный модуль для управления потоком, который называется asyncblock . Если перенос кода в функцию подходит для вашего случая, можно рассмотреть следующий пример:
источник
exec-sync
илиffi
на Windows имеет огромные накладные расходы (VC ++, SDK, Python и т. д.), но это легче.Это невозможно в Node.js, оба
child_process.spawn
иchild_process.exec
были созданы с нуля, чтобы быть асинхронными.Подробнее см .: https://github.com/ry/node/blob/master/lib/child_process.js.
Если вы действительно хотите иметь эту блокировку, затем поместите все, что должно произойти впоследствии, в обратный вызов, или создайте свою собственную очередь, чтобы обработать это блокирующим способом, я полагаю, вы могли бы использовать Async.js для этой задачи.
Или, если у вас слишком много времени, взломайте Node.js самостоятельно.
источник
Это самый простой способ, который я нашел:
источник
Просто чтобы добавить, что, хотя есть несколько вариантов использования, где вы должны их использовать,
spawnSync
/execFileSync
/execSync
были добавлены в node.js в этих коммитах: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748eисточник
Вы можете достичь этого, используя волокна. Например, используя мою библиотеку Common Node , код будет выглядеть так:
источник
Я привыкла реализовывать
"synchronous"
вещи в конце функции обратного вызова. Не очень приятно, но это работает. Если вам нужно реализовать последовательность выполнения командной строки, вам нужно заключитьexec
в какую-нибудь именованную функцию и рекурсивно вызвать ее. Этот шаблон, похоже, пригодится мне:источник
У меня была похожая проблема, и я закончил писать расширение узла для этого. Вы можете проверить репозиторий git. Это с открытым исходным кодом и бесплатно, и все такое хорошее!
https://github.com/aponxi/npm-execxi
Инструкции по использованию находятся в файле ReadMe . Не стесняйтесь подавать заявки или отправлять вопросы!
РЕДАКТИРОВАТЬ:
Однако он еще не возвращает стандартный вывод ... Просто выводит их в режиме реального времени.Это сейчас. Ну, я только что выпустил это сегодня. Может быть, мы можем основываться на этом.Во всяком случае, я думал, что стоит упомянуть об этом.
источник
npm install
удается (другими словами, как компиляция плагина), тогда хорошо идти в производство. Помимо нацеливания на разные версии nodejs, я бы сказал, что он исправлен для производства или что он довольно стабилен. Если есть какие-либо ошибки, вы можете отправить их по запросу или опубликовать вопрос на github :)Вы можете выполнять синхронные операции оболочки в nodejs следующим образом:
РЕДАКТИРОВАТЬ - этот пример предназначен для сред Windows, при необходимости настройте его под собственные потребности Linux
источник
У меня фактически была ситуация, когда мне нужно было запускать несколько команд одну за другой из сценария предварительной установки package.json таким образом, чтобы он работал как в Windows, так и в Linux / OSX, поэтому я не мог полагаться на неосновной модуль.
Так вот что я придумал:
Вы можете использовать это так:
РЕДАКТИРОВАТЬ: как указано, это на самом деле не возвращает результат или позволяет использовать результат команд в программе Node. Еще одна идея для этого заключается в использовании обратных вызовов LiveScript. http://livescript.net/
источник