تعلم كيفية تشغيل Subshells السليم عن طريق سكربتات باش

كيفية تعليمة Subshells لتشغيل في الموازي في الخلفية

يعد shell واجهة أساسية لإدخال الأوامر على نظام Linux. مع ذلك ، يمكنك إدخال أمر مباشرة أو تحديد ملف (نصي) يحتوي على سلسلة من الأوامر ليتم تنفيذها. يتم تنظيم الأصداف في تسلسل هرمي ، ويمكن لأي قذيفة إنشاء غلاف جديد. تعتبر shell الجديدة عملية تابعة - وهي عبارة عن شريحة فرعية - من shell الأصل الذي يقوم بإنشائها.

بشكل افتراضي ، يعتمد subshell على الأصل الخاص به بمعنى أنه في حالة إنهاء العملية الأصل ، سينتهي الجزء الفرعي أيضًا. يتم تمرير أي إخراج من subshell إلى shell الأصل.

كيفية إنشاء Subshell

في برنامج نصي Bash shell ، يمكنك إنشاء نموذج فرعي باستخدام تدوين الأقواس:

#! / bin / bash echo "قبل بدء subshell" (عدد = 1 بينما [$ count -le 99] do echo "$ count" sleep 1 ((count ++)) done) echo "Finished"

في المثال ، يتم تضمين حلقة while في أقواس ، مما يؤدي إلى تنفيذها في subshell من shell حيث يتم تنفيذ ملف البرنامج النصي.

تشغيل Subshell في الخلفية

ما لم تحدد أن subshell سيتم تنفيذه في الخلفية ، ينتظر shell الأصل من أجل الانتهاء من subshell قبل المتابعة مع باقي البرنامج النصي. ومع ذلك ، إذا كنت ترغب في تشغيل subshells بالتوازي ، يمكنك تشغيلها في الخلفية ، والتي يتم إنجازها باستخدام حرف علامة الضم بعد تعبير subshell ، كما هو موضح هنا:

#! / bin / bash echo "قبل بدء subshell" (العد = 1 بينما [$ count -le 99] لا echo "$ count" sleep 1 ((count ++)) done & echo "انتهى"

تشغيل Subshells متعددة في الموازي

إذا كنت تقوم بإنشاء عدة أحرف فرعية كعمليات خلفية ، فيمكنك تشغيل المهام بشكل متوازٍ. نموذجياً ، يستخدم نظام التشغيل معالجات أو نوى مختلفة لكل عملية وعمليات فرعية ، بافتراض وجود ما لا يقل عن العديد من المعالجات أو النوى حيث توجد عمليات. خلاف ذلك ، يتم تعيين المهام إلى نفس المعالجات أو النوى. في هذه الحالة ، يقوم المعالج أو النواة بالتبديل المستمر بين المهام المعينة حتى يتم الانتهاء من المهام. المثال التالي يحتوي على اثنين من subprocesses. الأولى من 1 إلى 99 ، والثانية من 1000 إلى 1099.

#! / bin / bash echo "قبل بدء subshell" (العد = 1 بينما [$ count -le 99] لا صدى النوم "$ count" 1 ((count ++)) & (عد = 1000 بينما [$ count -le 1099] لا صدى "$ count" sleep 1 ((count ++)) done & echo "انتهى"

استخدم العبارة الانتظار لإخبار العملية الأصل انتظار انتهاء العمليات الفرعية قبل المتابعة مع بقية البرنامج النصي:

#! / bin / bash echo "قبل بدء subshell" (العد = 1 بينما [$ count -le 99] لا صدى النوم "$ count" 1 ((count ++)) & (عد = 1000 بينما [$ count -le 1099] لا صدى "$ count" sleep 1 ((count ++)) منتهي & انتظر صدى "انتهى"

يستخدم ل Subshells

تعتبر Subshells مفيدة عند الحاجة إلى تنفيذ الأوامر في بيئة أو دليل معين. إذا تم تنفيذ كل أمر في سلسلة فرعية مختلفة ، فلا يوجد خطر من اختلاط إعدادات المتغير. عند الانتهاء ، لا يلزم استعادة الإعدادات والدليل الحالي ، نظرًا لأن بيئة العملية الرئيسية لا تتأثر بأي من عملياتها الفرعية.

يمكن استخدام Subshells في تعريفات الدالة بحيث يمكن تنفيذها عدة مرات باستخدام معلمات مختلفة.