ما هي الصدفة shell ؟
كثيرا من المستخدمين لنظام لينوك Linux systemلا يعرفوا مفهوم كلمة الصدفة shellبالرغم أنهم ل يستطيعون التعامل مع لينوكس
بدون هذه الصدفة .... shellوحتى تعرف أكثر عن هذه الصدفة shellوما أهميتها ما عليك فقط إل أن..........تستمر في القراءة.
تعتبر الصدفة shellحلقة الوصل بين المستخدم وبين نواة نظام التشغيل لينوكس . Linux kernelحيث أن أي أمر تكتبه في المحث promptتقوم الصدفة shellبأخذ المر commandوتفسيره ثم يمرر النتيجة إلى قلب النظام التشغيل لينوكس Linux Kernel
.وكما قلت أن الصدفة shellعبارة عن مفسرة للوامر والصدفة shellتحتوي في الأساس على أوامر خاص بها، ويمكن للصدفة أن تستخدم جميع البرامج والدوات المتوفرة على النظام.
ولكي يكون الكلام أكثر دقة ، فالصدفة تستطيع أن تعتبرها ، macro processorبحيث أنك عندما تدخل لها سطر أمر فإنها تقوم بمعالجة هذا السطر بحيث أنها تقوم بتقسيم هذا السطر إلى عدة أجزاء وكل جزء من الجزاء يتم ترجمته إلى تعليمات يفهمها نظام التشغيل .
وقبل أن ندخل في التفاصيل يجب أن أنوه إلى شيء مهم وهو أنه بمجرد أن تضغط زر التشغيل الخاص بالحاسب فإن هذه العمليات تحدث بالترتيب لكي تتمكن من التعامل مع النظام أو (النواة) في حالتنا هذه، والعمليات بالترتيب هي كالتي:
1- يقوم BIOSبتحميل أول مقطع sectorفي القرص الصلب ، حيث أنه يوجد برنامج تحميل النواة LILOأو ، GRUBيتم تحميله إلى الذاكرة الرئيسية RAMومن ثم يتم تنفيذ أي منهما ثم تظهر لك قائمة بها نظم التشغيل التي توجد بحاسبك ، طبعا في حالتنا هذه سوف نختار نظام لينوكس (بغض النظر عن التوزيعة المستخدمة .
2- يتم تحميل النواة من القرص الصلب إلى الذاكرة ، وهو عبارة عن ملف مضغوط يدعى . image
3- يتم فك ضغط هذا الملف ، ثم يتم تنفيذ الوامر الخاصة ببدء العمليات المكلفة بإدارة الجهاز.
4- تقوم النواة بعمل فحص للجهزة الموجودة وبدء تشغيلها .
5- تقوم النواة بتفعيل mountنظام الملفات الجذرية ، root file systemولنقل مثل /dev/hda
6- تقوم النواة بتنفيذ ،/ sbin/initحيث أن هذا البرنامج أول برنامج تنفذه النواة ، لذلك فإن PIDالخاص به يساوي 1 .
7- تقوم initبتنفيذ كل الملفات النصية التنفيذية scriptالخاصة بمستوى التشغيل ، run level
8- تقوم initبإنتاج برامج gettyلكل طرفية . terminal
9- gettyهو المحث الذي يظهر لك، ويطلب منك أن تدخل اسم المستخدم و كلمة المرور ، ومن ثم ينفذ المر /bin/loginللتأكد من صحة المدخلت.
01- وفي النهاية يقوم المر loginببدء عمل الصدفة . shell
كيف تعمل الصدفة؟
والشكل التالي يوضح كيف تقوم الصدفة shellبتفسير الأمر.
هذا الشكل يوضح الخطوات التي تتخذها الصدفة shellلتقرر ما الذي ستفعله مع الأوامر التي يكتبها المستخدم،وأول خطوة تقوم بها الصدفة shell أنه تحدد ما إذا كان الأمر الذي كتبه المستخدم من الوامر الأساسية للصدفة أم لا، فإذا لم تكن من الوامر الأساسية فإنها ترى ما إذا كانت من البرامج التطبيقية،والبرامج التطبيقية تنقسم إلى قسمين هما:
- برامج خدمية خاصة بالنظام مثل ls,rmأو برامج تطبيقية للمستخدمين سواء كانت هذه البرامج تجارية أو عامة.
- والصدفة shellتحاول في أن تجد هذه البرامج التطبيقية وذلك بالنظر في جميع الفهارس والتي توجد في مسار بحثك، وهذا المسار عبارة عن قائمة من الفهارس حيث توجد فيها البرامج القابلة للتنفيذ،وإذا لم يكن الأمر المدخل من أوامر الصدفة shellالداخلية أو ملفا قابل للتنفيذ في المسارالذي توجد عليه فإنه سوف يظهر لك رسالة خطأ.أما إذا كان أمرا من أوامر الصدفة shellالأساسية أو ملفا قابل للتنفيذ فإنهما سوف يذهبان إلى system callsثم يتم تمريرهما إلى قلب النظام . system kernel
وتتميز الصدفة بمفسر للغة البرمجة interpretive programming languageقوي،ولغة برمجة الصدفة shell programming language
تحتوي على معظم أدوات لغات البرمجة عالية المستوى مثل لجمل التكرارية والدوال والمتغيرات والمصفوفات .
يمكن أن تكتب أوامر وتستخدم معها الأدوات البرمجية الخاصة بالصدفة في ملف نصي عادي ، وهذه الوامر تقوم مثل بأحد المهام الحيوية بالنسبة لك أو لبرامجك ، ثم تقوم بحفظ هذا الملف الذي كتبت فيه هذه الوامر بامتداد ، shوبالتالي يسمى هذا الملف بملف نصي تنفيذي . scriptوفي كل
مرة تنفذ هذا الملف يقوم بتنفيذ كل الوامر التي كتبتها فيه بدون أن تكتبها أنت بنفسك مرة أخرى ، بمعنى أنه وفر عليك عناء كتابة عدة سطور قد تصل
إلى اللف في كل مرة تريد تنفيذ فيها هذه المهمة .
قبل أن أكمل أحب التنويه على شيء مهم قد يكون غائبا أو غامضا للكثيرين منا ، وهو عبارة عن سؤال ، ما هو الفرق بين سطر الوامر الذي اكتبه أنا
وبين الملف النصي التنفيذي؟
والاجابة هي أن سطر الوامر ل تستطيع أن تقوم بالعمليات البرمجية ذات المستوى العالي ، مثل الجمل التكرارية ، لذلك فإننا نلجأ لحل مثالي وهو الملف النصي التنفيذي . script
هل دراسة برمجة الصدفة shell programmingشيء مهم؟
هذا السؤال من السئلة المهمة التي قد أو تواجه مستخدمي أنظمة يونكس بشكل عام و لينوكس بشكل خاص.
وإجابة هذا السؤال كالتالي:
بالنسبة لمدير النظام يجب أن يكون ملماً ببرمجة الصدفة حتى يفهم تلك الملفات النصية التنفيذية ، حيث أن هذه الملفات مكتوبة بلغة الصدفة ، وبالتالي لا يستطيع مدير النظام أن يفهم هذه الملفات و لا كيف تتم سير العمليات في النظام إل من خلل معرفته باللغة التي كتبت بها هذه الملفات.
وأبسط مثال لذلك ، عندما يتم تحميل نظام لينوكس فإن النواة تقوم بتنفيذ الملفات النصية التنفيذية الموجودة في الفهرس ، /etc/rc.dحيث أنه من خلل هذه الملفات تستطيع أن تهيء النظام بالطريقة التي تناسبك ، وتستطيع أن تزود خدمات خاصة بك.
أما بالنسبة للمبرمجين وخصوصا محللي نظم التشغيل وخصوصا أنظمة يونكس وبالخص جدا نظامي linuxو ، GNU/hurdفبرمجة الصدفة بالنسبة لهم مهمة جدا لأنهم سيحتاجونها لعمل بعض العمليات التي قد تفيد برامجهم، كأدوات مساعدة لتلك البرامج ، وأيضا لفهم البرامج الموجودة أصل لكي يتسنى لهم تطوير هذه البرامج ، وأيضا لتحليل النظام نفسه وتتبع سير العمليات به لفهم طريقة عمله ولتطويره واستكشاف الخطاء وإصلحها ، وما إلى ذلك من الأمور البرمجية . ويجب التنبيه هنا ،بأنك تستطيع أن تغير محتويات هذه الملفات كما يحلو لك ، ولكن احذر بأن تغير محتويات ملفات هامة قد تؤثر في تشغيل النظام نفسه.
متى ل نستطيع أن نستخدم الملفات النصية التنفيذية الخاصة بالصدفة؟
- في العمليات التي نريدها أن تنفذ بأكبر سرعة ممكنة والتي يعتبر الوقت فيها من العوامل الرئيسة المهمة، مثل عمليات الفرز والبحث و..........
- في العمليات الرياضية المعقدة والتي تحتاج لدقة حسابية عالية .
- في التطبيقات المعقدة ، والتي تطلب وجود لغات برمجية مثل لغة ++ ، C / Cحيث أنك تستطيع أن تقوم فيها بإنشاء دوال ذات صفات خاصة وتتيح لك أدوات برمجية أخرى ومهمة ل تجدها في الصدفة.
- عندما تريد أن تنشئ تطبيقا يقوم بحماية النظام ضد عمليات الهجوم وما شابه ذلك .
- عندما تحتاج أن تنشيء مصفوفة متعددة البعاد.
- عندما تحتاج لبناء البيانات . data structure
- عندما تحتاج إلى إنشاء واجهة رسومية أو حتى تريد أن تتعامل معها.
- عندما تريد أن تتعامل مع الجهزة الموجودة بالنظام بصورة مباشرة.
- عندما تحتاج إلى portأو socketفي عمليات الدخال والخراج.
- عندما تريد أن تستخدم المكتبات.
- عندما تريد أن تنشيء تطبيقا غير متاح المصدر، حيث أن الملفات التنفيذية النصية تكون دائما مفتوحة المصدر ول يمكن غلقها.
الصدفات الكثر شيوعا
- الصدفة Bourne shell
قام بإنشائها ، Steven Bourneوهي الصدفة الصلية لنظام يونكس وتعتبر هذه الصدفة جيدة جدا في برمجة الصدفة تحت نظام يونكس ولكنها لديها قصور في التعامل مع المستخدمين عن الصدفات الخرى. - الصدفة C shell
هذه الصدفة قام بإنشائها ، Bill Joyوتتميز هذه الصدفة بسرعة استجابتها في التعامل مع المستخدمين وتفاعلتهم، وتتميز أيضا بخاصية إتمام
سطر الأوامر وهذا ليس موجودا في الصدفة . Bourne shellولكن برمجة الصدفة تحت C shellليست بمثل سهولة البرمجة تحت Bourne
shellولكنها تستخدم بكثرة عن طريق المبرمجين بلغة Cلن الصدفة C shellتتشابه مع لغة Cمن حيث كتابتها لذلك فهي سميت بـ C shell
- الصدفة Korn shell
هذه الصدفة تم كتابتها عن طريق ، Dave Kornحيث أنه أخذ مميزات الصدفتين Bourne shellو C shellوضمهم في صدفة وتعتبر
هذه الصدفة ملئمة تماما مع الصدفة . Bourne shellوالصدفة kshصدفة فعالة وتمتلك واجهة تفاعلية جيدة وواجهة برمجية أيضا جيدة. - الصدفة BASH shell
كلمة bashاختصار لـ . bourne again shell
تتميز هذه الصدفة بأن بها كل مميزات الصدفات السابقة ،بالضافة بأن هناك مميزات أخرى تتميز هي بها.وهي الصدفة القياسية لنظمة GNUكما أنها تعتبر أشهر وأهم صدفة في أنظمة يونكس بشكل عام. - وبالضافة إلى هذه الصدفات يوجد هناك صدفات اخرى وتتميز بما تتميز بها الصدفات السابق ذكرها ومن هذه الصدفات: tcshوهي تعتبر امتداد للصدفة ، ، cshوالصدفة Public Domain Korn Shellواختصارها pdkshوهي امتداد للصدفة . ksh
يمكن لنظتم التشغيل أن يحتوي أكثر من صدفة في الوقت ذاته . . . ولمعرفة الصدفات shell الموجودة نقوم بكتابة الأمر التالي :
- CODE: تحديد الكل
echo $SHELL
وسوف تكون المخرجات إما shأو cshأو kshأو ، bashحيث أن shتدل على الصدفة Bourneو cshتدل على صدفة ، Cو ksh تدل على صدفة kornو bashتدل على الصدفة . bash
لو كنت تعمل تحت صدفة معينة وأردت أن تنتقل إلى صدفة أخرى ما عليك إل أن تكتب اسمها ، فلو أردت مثل أن تنتقل إلى الصدفة bashاكتب الأمر
، bashولو أردت الرجوع إلى الصدفة الصلية ما عليك إل أن تكتب المر . exitلو ظهر ت لك رسالة not foundفهذا يدل على أن نظامك لا يحتوي على هذه الصدفة.
مثال :
لو أردت أن تعرف أين مكان الصدفة bashفي النظام فاكتب أحد الأوامر التالية: whereis bashأو whence bash أو ،which bash
أو اكتب المر التالي:
- CODE: تحديد الكل
grep bash /etc/passwd | awk -F: '{print $7}' | sort -u
وسوف تكون النتيجة كالتالي:
/bin/bashأو /usr/local/bin/bash
كما علمت فإنه يمكن أن يكون في نظامك أكثر من صدفة ، لنفرض أن الصدفة الافتراضية التي تعمل عندما تدخل إلى النظام هي ، Cفهل يمكنك أن تجعل الصدفة bashهي الفتراضية بحيث أنك إذا دخلت إلى النظام تكون هي الصدفة الفتراضية بدل من C؟
نعم ، يمكنك ذلك باستخدام المر ، chsh bash_nameحيث أن bash_nameهي المكان أو المسار التي توجد فيه الصدفة والتي نتجت من تنفيذ المر الذي كتبناه منذ قليل :
- CODE: تحديد الكل
grep bash /etc/passwd | awk -F: '{print $7}' | sort -u
وبالتالي سيكون الشكل النهائي للمر chshكالتالي:
- CODE: تحديد الكل
% chsh /usr/local/bin/bash
أو
- CODE: تحديد الكل
% chsh /bin/bash
وإذا لم توجد أي صدفة فسوف تظهر رسالة خطأ