Node.js এ একটি শেল কমান্ডের আউটপুট কার্যকর করুন এবং পান


113

নোড.জেজে, আমি ইউনিক্স টার্মিনাল কমান্ডের আউটপুট পাওয়ার উপায় খুঁজে পেতে চাই। এই কাজ করতে কোন উপায় আছে কি?

function getCommandOutput(commandString){
    // now how can I implement this function?
    // getCommandOutput("ls") should print the terminal output of the shell command "ls"
}

এটি কি একটি সদৃশ, বা এটি সম্পূর্ণ আলাদা কিছু বর্ণনা করে? stackoverflow.com/questions/7183307/…
অ্যান্ডারসন সবুজ

এটি আপনার আগ্রহী হতে পারে।
বেনকাস্টাহ

উত্তর:


142

আমি এখন যে প্রকল্পে কাজ করছি তাতে আমি যেভাবে এটি করি তা ঠিক।

var exec = require('child_process').exec;
function execute(command, callback){
    exec(command, function(error, stdout, stderr){ callback(stdout); });
};

উদাহরণ: গিট ব্যবহারকারী পুনরুদ্ধার করা

module.exports.getGitUser = function(callback){
    execute("git config --global user.name", function(name){
        execute("git config --global user.email", function(email){
            callback({ name: name.replace("\n", ""), email: email.replace("\n", "") });
        });
    });
};

3
এই ফাংশনটি কমান্ডের আউটপুট ফিরিয়ে দেওয়া সম্ভব? (আমি এটি করার চেষ্টা করছিলাম।)
অ্যান্ডারসন গ্রিন

1
thats যে কোড কি করে। আমি
সদ্য

2
@ অ্যান্ডারসগ্রিন আপনি "রিটার্ন" কীবোর্ডের সাহায্যে ফাংশনটি স্বাভাবিকভাবে ফিরে আসতে চাইবেন না, কারণ এটি শেল কমান্ডটি অবিচ্ছিন্নভাবে চলছে। ফলস্বরূপ, শেল কমান্ডটি সম্পূর্ণ হওয়ার পরে কোডটি সহ একটি কলব্যাক পাস করা ভাল।
নিক ম্যাককুরডি

1
খুব, আপনার প্রথম নমুনা যখন কোনও কলব্যাক কল করে তখন একটি ত্রুটির সম্ভাবনা উপেক্ষা করে। আমি ভাবছি stdoutযদি কোনও ত্রুটি হয় তবে কি হয় । আশা করি নির্দলীয় এবং নথিভুক্ত।
ডগ 65536

31

আপনি চাইল্ড_প্রসেস খুঁজছেন

var exec = require('child_process').exec;
var child;

child = exec(command,
   function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
      if (error !== null) {
          console.log('exec error: ' + error);
      }
   });

রেনাটো দ্বারা চিহ্নিত হিসাবে, এখানে এখন বেশ কয়েকটি সিঙ্ক্রোনাস এক্সিকিউটিভ প্যাকেজ রয়েছে, সিঙ্ক- এক্সিকিউট দেখুন যা আপনি যা খুঁজছেন তা আরও বেশি হতে পারে। যদিও মনে রাখবেন, নোড.জেএস একটি একক থ্রেডেড হাই পারফরম্যান্স নেটওয়ার্ক সার্ভার হিসাবে ডিজাইন করা হয়েছে, তাই আপনি যদি এটির জন্য ব্যবহার করতে চান তবে সিঙ্ক-এক্সিকিউট কিন্ডা স্টাফ থেকে দূরে থাকুন যতক্ষণ না আপনি কেবল স্টার্টআপের সময় এটি ব্যবহার করছেন unless অথবা অন্যকিছু.


1
এই ক্ষেত্রে, আমি কীভাবে কমান্ডের আউটপুট পেতে পারি? কমান্ড-লাইন আউটপুট ধারণ করে "স্টাডআউট" হয়?
অ্যান্ডারসন সবুজ

এছাড়াও, কলব্যাক ব্যবহার না করে কি একই রকম কিছু করা সম্ভব?
অ্যান্ডারসন সবুজ

সঠিক, stdout প্রোগ্রাম আউটপুট রয়েছে। এবং না, কলব্যাক ব্যতীত এটি করা সম্ভব নয়। নোড.জেএস-এ থাকা সমস্ত কিছুই অ-ব্লক হওয়ার আশেপাশে রয়েছে, প্রতিবার আপনি আইও করার সময় আপনি কলব্যাকগুলি ব্যবহার করতে যাচ্ছেন।
হেক্সিস্ট

নোট করুন যে আপনি যদি স্ক্রিপ্টি কিন্ডা জিনিসগুলি করতে যেখানে আপনি সত্যিই আউটপুট এবং সেই ধরণের জিনিসটির জন্য অপেক্ষা করতে চান তা জাভাস্ক্রিপ্ট ব্যবহার করে খুঁজছেন তবে আপনি ভি 8 শেলটি দেখতে পাবেন,
ডি

@ হেক্সিস্টে এমন কিছু Syncপদ্ধতি রয়েছে যা স্থানীয়ভাবে উপলব্ধ, তাই এটিও এড়ানো উচিত
রেনাটো গামা

29

আপনি যদি 7..6 এর পরে নোড ব্যবহার করেন এবং আপনি কলব্যাক শৈলী পছন্দ করেন না তবে শেল কমান্ডগুলি পরিষ্কারভাবে পড়ার জন্য আপনি নোড-ইউজ-এর promisifyফাংশনটিও ব্যবহার করতে পারেন async / await। এই কৌশলটি ব্যবহার করে গৃহীত উত্তরের একটি উদাহরণ এখানে দেওয়া হয়েছে:

const { promisify } = require('util');
const exec = promisify(require('child_process').exec)

module.exports.getGitUser = async function getGitUser () {
  const name = await exec('git config --global user.name')
  const email = await exec('git config --global user.email')
  return { name, email }
};

এটি ব্যর্থ কমান্ডগুলির ক্ষেত্রে প্রত্যাখ্যাত প্রতিশ্রুতি ফিরিয়ে দেওয়ার অতিরিক্ত সুবিধাও রয়েছে, যা try / catchঅ্যাসিঙ্ক কোডের সাথে পরিচালনা করা যেতে পারে ।


আপনি কি এই চেষ্টা করেছেন? আমি { stdout: string, stderr: string }ফলাফল হিসাবে পাচ্ছিawait exec(...)
ফুয়েলফেল

1
হ্যাঁ, আমার স্পষ্ট করা উচিত ছিল যে এটি আপনাকে স্টাডআউট এবং স্টডার উভয় সহ পুরো শেল আউটপুট দেয় । আপনি শুধু আউটপুট চান, আপনি গত লাইন পরিবর্তন হতে পারে: return { name: name.stdout.trim(), email: email.stdout.trim() }
আনসিক্ট

16

রেনাটো উত্তরের জন্য ধন্যবাদ, আমি একটি সত্যিকারের প্রাথমিক উদাহরণ তৈরি করেছি:

const exec = require('child_process').exec

exec('git config --global user.name', (err, stdout, stderr) => console.log(stdout))

এটি কেবল আপনার গ্লোবাল গিট ব্যবহারকারীর নাম মুদ্রণ করবে :)


11

আবশ্যকতা

এর জন্য নোড.জেএস 7 বা তারপরে প্রতিশ্রুতি এবং অ্যাসিঙ্ক / অ্যাওয়েটের সহায়তার প্রয়োজন হবে।

সমাধান

একটি মোড়ক ফাংশন তৈরি করুন যা child_process.execকমান্ডের আচরণ নিয়ন্ত্রণের জন্য প্রতিশ্রুতি দেয় ।

ব্যাখ্যা

প্রতিশ্রুতি এবং একটি অ্যাসিনক্রোনাস ফাংশন ব্যবহার করে, আপনি কলব্যাক নরকের মধ্যে না পড়ে এবং একটি সুন্দর ঝরঝরে এপিআই দিয়ে আউটপুট ফেরত শেলের আচরণের নকল করতে পারেন। awaitকীওয়ার্ডটি ব্যবহার করে আপনি এমন একটি স্ক্রিপ্ট তৈরি করতে পারেন যা সহজেই পড়া যায়, যদিও এখনও কাজটি child_process.execসম্পন্ন করতে সক্ষম হয়।

কোড নমুনা

const childProcess = require("child_process");

/**
 * @param {string} command A shell command to execute
 * @return {Promise<string>} A promise that resolve to the output of the shell command, or an error
 * @example const output = await execute("ls -alh");
 */
function execute(command) {
  /**
   * @param {Function} resolve A function that resolves the promise
   * @param {Function} reject A function that fails the promise
   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
   */
  return new Promise(function(resolve, reject) {
    /**
     * @param {Error} error An error triggered during the execution of the childProcess.exec command
     * @param {string|Buffer} standardOutput The result of the shell command execution
     * @param {string|Buffer} standardError The error resulting of the shell command execution
     * @see https://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
     */
    childProcess.exec(command, function(error, standardOutput, standardError) {
      if (error) {
        reject();

        return;
      }

      if (standardError) {
        reject(standardError);

        return;
      }

      resolve(standardOutput);
    });
  });
}

ব্যবহার

async function main() {
  try {
    const passwdContent = await execute("cat /etc/passwd");

    console.log(passwdContent);
  } catch (error) {
    console.error(error.toString());
  }

  try {
    const shadowContent = await execute("cat /etc/shadow");

    console.log(shadowContent);
  } catch (error) {
    console.error(error.toString());
  }
}

main();

নমুনা আউটপুট

root:x:0:0::/root:/bin/bash
[output trimmed, bottom line it succeeded]

Error: Command failed: cat /etc/shadow
cat: /etc/shadow: Permission denied

এটি অনলাইনে চেষ্টা করুন।

Repl.it

বাহ্যিক সংস্থান

প্রতিশ্রুতি

child_process.exec

নোড.জেএস সাপোর্ট টেবিল

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