تو این پست میخوام در مورد اجرای دستورات که میشه تو shell اجرا کرد و اجرای اون ها در node.js صحبت کنم که خیلی جاها ممکنه به دردمون بخوره.
خب به لطف کتابخونه ZX گوگل که میتونید از npm اونو بگیرن این کار امکان پذیره :)
نکته: حتما باید ورژن node از v14.13.1 بیشتر باشه.
npm i zx
خب به کمک این کتابخونه میتونیم مستقم دستورات لینوکسی که لازم داریم رو تویه node.js بنویسم
البته خود node.js به کمک ماژول child_process که داره میتونه تمامی دستوراتی که تو shell اجرا میشن رو اجرا کنه ولی کار با zx خیلی راحت و تمیز تره ;)
از طریق child_process با کمک متد exec میشه دستورات رو اجرا کرد اما نکته ای که داره اینه به صورت callback هست و کلا این مدلی خیلی کمکی به تمیز بودن کد نمیکنه برای همین گفتم با استفاده از zx خیلی راحت ترو تمیز تره.
child_process.exec(command[, options][, callback])
خب اگه بخوایم یه دستور لینوکسی رو اجرا کنیم به صورت زیر عمل میکنم:
const { $ } = require('zx');
(async () => {
const output1 = await $`date`; const output2 = await $`ls -al`; console.log(output1.stdout); console.log(output2.stdout);
})();
برای اجرای command ها ما باید از $ استفاده کنیم که در ابتدا از zx میگیریم و سپس دستورات رو داخل backtick [ $`command` ] جلویه $ قرار میدیم.
-- از این دستور سه تا object به صورت خروجی داریم:
1- stdout: که خروجی دستور اجرایی در اون ذخیره شده.
2- stderr: اگر دستور به خطا بخوره خطا در این object قرار میگیره.
3- exitCode: اگر دستور مورد نظر با موفقیت اجرا بشه 0 برمیگرده.
- حتی میشه چندتا دستور رو به صورت همزمان به کمک Promise.all اجرا کرد.
- اینم بگم که خود zx داره از child_process که تو هسته node.js هست استفاده میکنه.
تا اینجا شد اجرای دستورات در محیط shell، خب کتابخونه zx یسری توابع کاربردی دیگه هم داره که ممکنه خیلی به کارمون بیاد برای مثال:
cd();
fetch();
question();
sleep();
حالا برای آشنایی بیشتر میتونید به صفحه npm یا گیت هاب zx سر بزنید.
طبق عادتی که دارم سعی میکنم کوتاه و خلاصه توضیح بدم امیدوارم مفید بوده باشه براتون :)