node.js - توجيه متغير جافاسكريبت إلى أمر شل باستخدام nodejs


أنا أعمل على تطبيق Node.js وأحتاج إلى تمرير سلسلة نصية متعددة الأسطر إلى أمر شل. لست محترفًا في كتابة سكربتات الشل، ولكن إذا قمت بتشغيل هذا الأمر في الطرفية الخاصة بي فإنه يعمل بشكل جيد:

$((cat $filePath) | dayone new)

إليك ما لدي بالنسبة لجانب Node.js. أمر dayone يعمل لكن لا يوجد شيء يتم تمريره إليه.

const cp = require('child_process');
const terminal = cp.spawn('bash');

var multiLineVariable = 'Multi\nline\nstring';

terminal.stdin.write('mul');
cp.exec('dayone new', (error, stdout, stderr) => {
    console.log(error, stdout, stderr);
});
terminal.stdin.end();

شكراً على أي مساعدة!

الإجابة رقم 1

هنا، أنت تبدأ bash باستخدام spawn، لكن بعد ذلك تستخدم exec لتشغيل برنامج dayone الخاص بك. إنها عمليات فرعية منفصلة وليست مرتبطة بأي شكل من الأشكال.

'cp' هو مجرد إشارة إلى وحدة child_process، وspawn و exec هما طريقتان مختلفتان لبدء العمليات الفرعية.

يمكنك استخدام باش وكتابة أمر dayone الخاص بك إلى stdin من أجل استدعاء dayone (كما يبدو أن المقتطف الخاص بك يحاول القيام به)، أو يمكنك ببساطة استدعاء dayone مباشرة باستخدام exec (ضع في اعتبارك أن exec لا يزال يقوم بتشغيل الأمر في شل):

var multiLineVariable = 'Multi\nline\nstring';

// get the child_process module
const cp = require('child_process');

// open a child process
var process = cp.exec('dayone new', (error, stdout, stderr) => {
    console.log(error, stdout, stderr);
});

// write your multiline variable to the child process
process.stdin.write(multiLineVariable);
process.stdin.end();

الإجابة رقم 2

مع التدفقات القابلة للقراءة، من السهل حقًا الاستماع إلى المدخلات

const chunks = [];
process.stdin.on('readable', () => {
  const chunk = process.stdin.read()
  chunks.push(chunk);
  if (chunk !== null) {
    const result = Buffer.concat(chunks);
    console.log(result.toString());
  }
});

باستخدام التدفقات القابلة للكتابة يمكنك الكتابة إلى stdout

 process.stdout.write('Multi\nline\nstring');

آمل أن أتمكن من مساعدتك