Potrzebuję w funkcji node.js.
result = execSync('node -v');
która synchronicznie wykona podaną linię poleceń i zwróci wszystkie stdout'ed przez ten tekst polecenia.
ps. Synchronizacja jest nieprawidłowa. Wiem. Tylko do użytku osobistego.
AKTUALIZACJA
Teraz mamy rozwiązanie mgutz, które daje nam kod zakończenia, ale nie stdout! Wciąż czekam na dokładniejszą odpowiedź.
AKTUALIZACJA
mgutz zaktualizował swoją odpowiedź i rozwiązanie jest tutaj :)
Ponadto, jak wspomniał dgo.a , istnieje samodzielny moduł exec-sync
UPDATE 2014-07-30
Przybyła biblioteka ShellJS . Rozważ, że to najlepszy wybór na razie.
AKTUALIZACJA 10.02.2015
W KOŃCU! NodeJS 0.12 obsługuje execSync
natywnie.
Zobacz oficjalne dokumenty
Odpowiedzi:
Node.js (od wersji 0.12 - czyli przez chwilę) obsługuje
execSync
:Możesz teraz zrobić to bezpośrednio:
i zrobi to, czego oczekujesz. (Domyślnie potokuje wyniki wejścia / wyjścia do procesu nadrzędnego). Zauważ, że możesz
spawnSync
teraz.źródło
Zobacz bibliotekę execSync .
Dość łatwo to zrobić z node-ffi . Nie polecałbym procesów serwerowych, ale w przypadku ogólnych narzędzi programistycznych to załatwia sprawę. Zainstaluj bibliotekę.
Przykładowy skrypt:
[EDIT Jun 2012: How to get STDOUT]
źródło
stdout
z tego? Wszystko, co mogę uzyskać, to kod zakończenia procesuexecSync
nie jest częściąchild_process
. Myślę, że tak powinno być.Użyj modułu ShellJS .
exec bez wywołania zwrotnego.
Przykład:
źródło
exec()
obciąża procesor w przypadku długich procesów.const execSync = require('child_process').execSync; code = execSync('node -v');
W node.js jest doskonały moduł do kontroli przepływu o nazwie asyncblock . Jeśli zawijanie kodu w funkcję jest w porządku w Twoim przypadku, można wziąć pod uwagę następujący przykład:
źródło
exec-sync
lubffi
w systemie Windows wiąże się z ogromnym narzutem (VC ++, SDK, Python itp.), Ale to jest lżejsze.Nie jest to możliwe w Node.js, oba
child_process.spawn
ichild_process.exec
zostały zbudowane od podstaw, aby były asynchroniczne.Aby uzyskać szczegółowe informacje, patrz: https://github.com/ry/node/blob/master/lib/child_process.js
Jeśli naprawdę chcesz mieć to blokowanie, umieść wszystko, co musi się wydarzyć później, w wywołaniu zwrotnym lub zbuduj własną kolejkę, aby obsłużyć to w sposób blokujący, przypuszczam, że możesz użyć Async.js do tego zadania.
Lub, jeśli masz zbyt dużo czasu do spędzenia, włamać się do Node.js samodzielnie.
źródło
To najłatwiejszy sposób, jaki znalazłem:
źródło
Wystarczy dodać, że chociaż jest kilka przypadków użycia, w których powinieneś ich użyć,
spawnSync
/execFileSync
/execSync
zostały dodane do node.js w tych zatwierdzeniach: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748eźródło
Możesz to osiągnąć za pomocą włókien. Na przykład, używając mojej biblioteki Common Node , kod wyglądałby następująco:
źródło
Przyzwyczajam się do implementacji
"synchronous"
rzeczy na końcu funkcji zwrotnej. Niezbyt ładne, ale działa. Jeśli chcesz zaimplementować sekwencję wykonań wiersza poleceń, musisz zawinąćexec
w jakąś nazwaną funkcję i rekurencyjnie ją wywołać. Ten wzór wydaje mi się przydatny:źródło
Miałem podobny problem i napisałem do tego rozszerzenie węzła. Możesz sprawdzić repozytorium git. To open source, darmowe i wszystkie dobre rzeczy!
https://github.com/aponxi/npm-execxi
Instrukcje użytkowania znajdują się w pliku ReadMe . Zapraszam do składania żądań ściągnięcia lub zgłaszania problemów!
EDYCJA:
Jednak nie zwraca jeszcze standardowego wyjścia ... Po prostu wyświetla je w czasie rzeczywistym.Teraz tak. Cóż, właśnie go dzisiaj wydałem. Może możemy na tym zbudować.Zresztą pomyślałem, że warto o tym wspomnieć.
źródło
npm install
powiedzie (innymi słowy jako kompilacja wtyczki), dobrze jest iść do produkcji. Oprócz kierowania na różne wersje nodejs, powiedziałbym, że jest poprawiony do produkcji lub że jest całkiem stabilny. Jeśli są jakieś błędy, możesz wysłać prośbę o ściągnięcie lub opublikować problem na github :)możesz wykonywać synchroniczne operacje powłoki w nodejs w ten sposób:
EDYCJA - ten przykład jest przeznaczony dla środowisk Windows, w razie potrzeby dostosuj do własnych potrzeb Linuksa
źródło
W rzeczywistości miałem sytuację, w której musiałem uruchamiać wiele poleceń jedno po drugim ze skryptu preinstalacji package.json w sposób, który działałby zarówno w systemie Windows, jak i Linux / OSX, więc nie mogłem polegać na module spoza jądra.
Oto co wymyśliłem:
Możesz go używać w ten sposób:
EDYCJA: jak wskazano, w rzeczywistości nie zwraca to danych wyjściowych ani nie pozwala na użycie wyniku poleceń w programie Node. Innym pomysłem na to jest użycie wywołań zwrotnych LiveScript. http://livescript.net/
źródło