Child_process.execSync का उपयोग करें लेकिन कंसोल में आउटपुट रखें


160

मैं उस execSyncविधि का उपयोग करना चाहता हूं जिसे NodeJS 0.12 में जोड़ा गया था, लेकिन अभी भी कंसोल विंडो में आउटपुट है जिसमें से मैं नोड स्क्रिप्ट चलाता हूं।

उदाहरण के लिए, यदि मैं एक NodeJS स्क्रिप्ट चलाता हूं जिसमें निम्नलिखित पंक्ति है जो मैं कंसोल के अंदर rsync कमांड "लाइव" का पूरा आउटपुट देखना चाहता हूं:

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');

मैं समझता हूं कि execSyncआदेश का विवरण लौटाता है और जिसे मैं निष्पादन के बाद कंसोल में प्रिंट कर सकता हूं, लेकिन इस तरह से मेरे पास "फ़ाइल" नहीं है ...

जवाबों:


324

यदि आप चाहते हैं कि आप बच्चे की प्रक्रिया के लिए माता-पिता की stdio पास कर सकते हैं:

require('child_process').execSync(
    'rsync -avAXz --info=progress2 "/src" "/dest"',
    {stdio: 'inherit'}
);

3
इसका मतलब यह है कि बच्चे की प्रक्रिया माता-पिता के स्टड, स्टडआउट और स्टेडर धाराओं का उपयोग करेगी। इसलिए जब बाल प्रक्रिया उनमें से किसी एक को लिखती है, तो यह वास्तव में सीधे पैरेंट स्ट्रीम में लिखी जाएगी।
ग्रिगर्स

7
यह एक बहुत ही मूल्यवान उत्तर है, क्योंकि आधिकारिक दस्तावेज वास्तव में अपेक्षित वाक्यविन्यास के बारे में स्पष्ट नहीं है।
चिकमचि

49
इसके बजाय [0,1,2]मैंने प्रयोग किया है 'inherit', जो डॉक्स के अनुसार [process.stdin, process.stdout, process.stderr]या बराबर है[0,1,2]
कर्ट

10
options.stdioप्रलेखन के लिए सही लिंक : nodejs.org/api/child_process.html#child_process_options_stdio
Shaun Lebron

2
@Booligoosh केवल जोड़ने के बजाय {stdio:'inherit'}, आपको .toString () जोड़ना होगा और फिर कंसोल को कॉल करना होगा। परिणाम के साथ मैन्युअल रूप से। इसके अलावा, यह कमांड आउटपुट "लाइव" देखने की आवश्यकता को भी पूरा नहीं करता है। मुझे नहीं लगता कि यह "बहुत सरल" है, वास्तव में मुझे नहीं लगता कि यह बिल्कुल सरल है।
बोइल्यू

19

आप बस उपयोग कर सकते हैं .toString()

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

यह नोड पर परीक्षण किया गया है v8.5.0, मैं पिछले संस्करणों के बारे में निश्चित नहीं हूं। @Etov के अनुसार , यह काम नहीं करता है v6.3.1- मैं इन-बीच के बारे में निश्चित नहीं हूं।


3
यह विफलता पर काम नहीं करता है (स्थिति कोड! = 0) क्योंकि .execSync()एक Errorउदाहरण फेंकता है ।
अलवारो गोंजालेज

मेरे लिए काम नहीं करता है, यानी आउटपुट केवल कमांड खत्म होने के बाद लिखा जाता है। क्या यह एक विशिष्ट संस्करण पर लागू होता है? मेरा नोड -v: v6.3.1
etov

कृपया ध्यान दें कि उत्तर को केवल कुछ नोड संस्करणों पर लागू करने के लिए इसे अपडेट करने पर विचार करें - यह इसे दूसरों के लिए अधिक उपयोगी बना देगा
etov

1
आदेश के दौरान आउटपुट से संबंधित प्रश्न के संबंध में टीआई के बाद से डाउनवोट को निष्पादित किया जाता है।
karfau

14

जब तक आप स्‍ट्रेडआउट और स्‍ट्रेडर को स्‍वीकार नहीं किया जाता जब तक कि स्‍वीकृत उत्‍तर नहीं मिल जाता है, तब तक यह निष्‍पादन या स्‍पॉन्‍ससंक के साथ संभव नहीं है। Stdout और stderr को पुनर्निर्देशित किए बिना उन कमांड केवल stdout और stderr को वापस करते हैं जब कमांड पूरा हो जाता है।

Stdout और Stderr को पुनर्निर्देशित किए बिना ऐसा करने के लिए, आपको ऐसा करने के लिए स्पॉन का उपयोग करने की आवश्यकता है, लेकिन यह बहुत आसान है:

var spawn = require('child_process').spawn;

//kick off process of listing files
var child = spawn('ls', ['-l', '/']);

//spit stdout to screen
child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

//spit stderr to screen
child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

child.on('close', function (code) { 
    console.log("Finished with code " + code);
});

मैंने एक ls कमांड का उपयोग किया जो फ़ाइलों की पुनरावर्ती सूची देता है ताकि आप इसे जल्दी से जांच सकें। स्पॉन पहले तर्क के रूप में लेता है निष्पादन योग्य नाम जिसे आप चलाने की कोशिश कर रहे हैं और जैसा कि यह दूसरा तर्क है यह उस पैरामीटर का प्रतिनिधित्व करने वाले प्रत्येक पैरामीटर का एक सरणी लेता है जिसे आप उस निष्पादन योग्य में पास करना चाहते हैं।

हालाँकि, यदि आप निष्कासन का उपयोग कर रहे हैं और किसी कारण से stdout या stderr को रीडायरेक्ट नहीं कर सकते हैं, तो आप xterm की तरह एक और टर्मिनल खोल सकते हैं और इसे एक कमांड दे सकते हैं जैसे:

var execSync = require('child_process').execSync;

execSync("xterm -title RecursiveFileListing -e ls -latkR /");

यह आपको यह देखने की अनुमति देगा कि नए टर्मिनल में आपकी कमांड क्या कर रही है, लेकिन अभी भी सिंक्रोनस कॉल है।


2
स्पॉन का उपयोग करने वाला उदाहरण सही हो सकता है, लेकिन निष्पादन प्रणाली के उपयोग के बारे में नहीं होने के बारे में प्रारंभिक विवरण सटीक नहीं है। जवाब देखें @gregers से
AgDude
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.