Saya membutuhkan fungsi node.js
result = execSync('node -v');
yang secara sinkron akan mengeksekusi baris perintah yang diberikan dan mengembalikan semua stdout'ed oleh teks perintah itu.
ps. Sinkronisasi salah. Aku tahu. Hanya untuk penggunaan pribadi.
MEMPERBARUI
Sekarang kami memiliki solusi mgutz yang memberi kami kode keluar, tetapi tidak stdout! Masih menunggu jawaban yang lebih tepat.
MEMPERBARUI
mgutz memperbarui jawabannya dan solusinya ada di sini :)
Juga, seperti yang disebutkan dgo.a , ada modul yang berdiri sendiri exec-sync
UPDATE 2014-07-30
Lib ShellJS tiba. Anggap ini adalah pilihan terbaik untuk saat ini.
UPDATE 2015-02-10
AKHIRNYA! NodeJS 0.12 mendukung execSync
secara asli.
Lihat dokumen resmi
Jawaban:
Node.js (sejak versi 0.12 - untuk sementara waktu) mendukung
execSync
:Anda sekarang dapat langsung melakukan ini:
dan itu akan melakukan apa yang Anda harapkan. (Default untuk menyalurkan hasil i / o ke proses induk). Perhatikan bahwa Anda juga bisa
spawnSync
sekarang.sumber
Lihat perpustakaan execSync .
Ini cukup mudah dilakukan dengan node-ffi . Saya tidak akan merekomendasikan untuk proses server, tetapi untuk pengembangan umum utilitas itu menyelesaikan sesuatu. Instal perpustakaan.
Skrip contoh:
[EDIT Jun 2012: Cara mendapatkan STDOUT]
sumber
stdout
dari ini? Yang bisa saya dapatkan hanyalah kode proses keluarexecSync
ini bukan bagian darichild_process
. Saya pikir, seharusnya begitu.Gunakan ShellJS modul .
eksekutiffungsi tanpa memberikan panggilan balik.
Contoh:
sumber
exec()
adalah CPU intensif untuk proses yang panjang.const execSync = require('child_process').execSync; code = execSync('node -v');
Ada modul yang sangat baik untuk kontrol aliran di node.js yang disebut asyncblock . Jika membungkus kode dalam suatu fungsi OK untuk kasus Anda, sampel berikut dapat dipertimbangkan:
sumber
exec-sync
atauffi
pada Windows memiliki overhead yang sangat besar (VC ++, SDKs, Python, dll), tetapi ini lebih ringan.Ini tidak mungkin di Node.js, keduanya
child_process.spawn
danchild_process.exec
dibangun dari bawah ke atas menjadi async.Untuk detailnya lihat: https://github.com/ry/node/blob/master/lib/child_process.js
Jika Anda benar-benar ingin memiliki pemblokiran ini, maka letakkan semua yang perlu terjadi setelah itu dalam panggilan balik, atau buat antrean Anda sendiri untuk menangani hal ini dengan cara pemblokiran, saya kira Anda bisa menggunakan Async.js untuk tugas ini.
Atau, jika Anda memiliki terlalu banyak waktu untuk dihabiskan, coba-coba Node.js sendiri.
sumber
Ini adalah cara termudah yang saya temukan:
sumber
Hanya untuk menambahkan bahwa meskipun ada beberapa usecases di mana Anda harus menggunakannya,
spawnSync
/execFileSync
/execSync
ditambahkan ke node.js dalam komit ini: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748esumber
Anda dapat mencapai ini menggunakan serat. Misalnya, menggunakan perpustakaan Common Node saya , kode akan terlihat seperti ini:
sumber
Saya terbiasa menerapkan
"synchronous"
hal-hal di akhir fungsi panggilan balik. Tidak terlalu bagus, tetapi berhasil. Jika Anda perlu mengimplementasikan urutan eksekusi baris perintah, Anda perlu membungkusnyaexec
dengan beberapa fungsi bernama dan memanggilnya secara rekursif. Pola ini tampaknya dapat digunakan untuk saya:sumber
Saya memiliki masalah yang sama dan akhirnya saya menulis ekstensi node untuk ini. Anda dapat memeriksa repositori git. Ini open source dan gratis dan semuanya bagus!
https://github.com/aponxi/npm-execxi
Instruksi penggunaan ada di file ReadMe . Jangan ragu untuk melakukan permintaan tarik atau mengirim masalah!
EDIT:
Namun itu belum mengembalikan stdout ... Hanya keluaran mereka secara real-time.Itu sekarang. Yah, saya baru saja merilisnya hari ini. Mungkin kita bisa membangunnya.Bagaimanapun, saya pikir itu layak untuk disebutkan.
sumber
npm install
berhasil (dengan kata lain sebagai plugin kompilasi), maka baik untuk produksi. Selain menargetkan berbagai versi nodejs, saya akan mengatakan itu ditambal untuk produksi, atau itu cukup stabil. Jika ada bug, Anda dapat mengirim permintaan tarik atau memposting masalah di github :)Anda dapat melakukan operasi shell sinkron di nodejs seperti:
EDIT - contoh ini dimaksudkan untuk lingkungan windows, sesuaikan dengan kebutuhan linux Anda sendiri jika perlu
sumber
Saya sebenarnya memiliki situasi di mana saya perlu menjalankan beberapa perintah satu per satu dari script package.json preinstall dengan cara yang akan bekerja pada Windows dan Linux / OSX, jadi saya tidak bisa mengandalkan modul non-inti.
Jadi inilah yang saya pikirkan:
Anda bisa menggunakannya seperti ini:
EDIT: seperti yang ditunjukkan, ini sebenarnya tidak mengembalikan output atau memungkinkan Anda untuk menggunakan hasil dari perintah dalam program Node. Satu ide lain untuk itu adalah menggunakan backcalls LiveScript. http://livescript.net/
sumber