চাইল্ড_প্রসেস.এক্সেকসিঙ্ক ব্যবহার করুন তবে আউটপুট কনসোলে রাখুন


160

আমি execSyncনোডজেএস 0.12 এ যুক্ত হওয়া পদ্ধতিটি ব্যবহার করতে চাই তবে কনসোল উইন্ডোতে আউটপুট রয়েছে যা থেকে আমি নোড স্ক্রিপ্টটি চালিয়েছি।

উদাহরণস্বরূপ, যদি আমি কোনও নোডজেএস স্ক্রিপ্ট চালনা করি যার নীচের লাইনটি আমি কনসোলের অভ্যন্তরে আরএসসিএনসি কমান্ড "লাইভ" এর সম্পূর্ণ আউটপুট দেখতে চাই:

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

আমি বুঝতে পারি যে execSyncকমান্ডের আউটপুট ফিরিয়ে দেয় এবং মৃত্যুদন্ড কার্যকর হওয়ার পরে আমি এটি কনসোলে মুদ্রণ করতে পারি তবে এইভাবে আমার "লাইভ" আউটপুট নেই ...

উত্তর:


324

আপনি যা চান তা যদি আপনি সন্তানের প্রক্রিয়াতে পিতামাতার স্টিডিওটি পাস করতে পারেন:

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

3
এর অর্থ হল যে শিশু প্রক্রিয়াটি পিতামাতার স্টিডিন, স্টডআউট এবং স্টডার স্ট্রিম ব্যবহার করবে। সুতরাং যখন শিশু প্রক্রিয়া তাদের উভয়কেই লিখবে, এটি আসলে পিতামাতার স্ট্রিমে সরাসরি লেখা হবে।
গ্রেজার 21

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
শান লেবারন

2
@ বুলিগুশ কেবল যোগ করার পরিবর্তে {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উদাহরণ নিক্ষেপ করে ।
vlvaro González

আমার পক্ষে কাজ করে না, অর্থাৎ আউটপুট কেবল কমান্ড শেষ হওয়ার পরে লেখা হয়। এটি কি কোনও নির্দিষ্ট সংস্করণে প্রযোজ্য? আমার নোড-ভি: ভি 6.3.1
ইটোভি

এটি নির্দিষ্ট কিছু নোড সংস্করণেই প্রযোজ্য তা নোট করার জন্য দয়া করে উত্তরটি আপডেট করার বিষয়ে বিবেচনা করুন - এটি অন্যের জন্য আরও দরকারী করে তোলে
ইতোভি

1
কমান্ড চলাকালীন আউটপুট সম্পর্কিত প্রশ্নের সাথে সম্পর্কিত টিআই এর উপায় এখনই কার্যকর হয়েছে।
করফাউ

14

আপনি স্টাডআউট এবং স্টডারকে পুনঃনির্দেশ না করা হিসাবে যদি না গৃহীত উত্তরের পরামর্শ দেয় তবে এক্সিকিউসসিঙ্ক বা স্পোনসিঙ্ক দিয়ে এটি সম্ভব নয়। 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);
});

আমি একটি এলএস কমান্ড ব্যবহার করেছি যা ফাইলগুলি পুনরাবৃত্তির সাথে তালিকাবদ্ধ করে যাতে আপনি এটি দ্রুত পরীক্ষা করতে পারেন। স্পন প্রথম আর্গুমেন্ট হিসাবে আপনি চালনার চেষ্টা করছেন এমন এক্সিকিউটেবল নাম হিসাবে গ্রহণ করে এবং এটি দ্বিতীয় যুক্তি হিসাবে এটি আপনি যে নির্বাহীটিতে যেতে চান তা প্রতিটি প্যারামিটারের প্রতিনিধিত্ব করে স্ট্রিংগুলির একটি অ্যারে লাগে।

তবে, যদি আপনি এক্সিকিউনসিঙ্ক ব্যবহার শুরু করে থাকেন এবং কোনও কারণে স্টডআউট বা স্ট্ডারকে পুনঃনির্দেশ করতে না পারেন, আপনি এক্সটারের মতো অন্য একটি টার্মিনাল খুলতে পারেন এবং এটির মতো একটি কমান্ড পাস করতে পারেন:

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

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

এটি আপনাকে আপনার নতুন কমান্ডটি নতুন টার্মিনালে কী করছে তা দেখার অনুমতি দেয় তবে এখনও সিঙ্ক্রোনাস কল রয়েছে।


2
স্প্যান ব্যবহার করে উদাহরণটি সঠিক হতে পারে তবে এক্সিকিউসসিঙ্ক ব্যবহার না করা সম্পর্কে উদ্বোধনী বিবৃতিটি সঠিক নয়।
@
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.