وحدات البناء الأساسية في Bash
وحدات بناء الصدفة
البنية اللغوية للصدفة (Shell Syntax)
إن كان المُدخَل ليس تعليقًا (comment) فإن الصدفة تقرؤه وتقسمه إلى كلمات ومعامِلات مطبِّقة قواعد الاقتباس (quoting rules) لتحدد معنى كل مِحرَف (character)، ثم تُترجَم تلك الكلمات والمعامِلات إلى أوامر وعناصر أخرى ينتج عنها حالة الخروج المناسبة للعملية. ولا تُطبَّق آلية fork-exec التي ذكرناها في تنفيذ الأوامر في Bash إلا بعد أن تحلل الصدفة المُدخلات وفقًا للخطوات الآتية:
- تقرأ الصدفة المُدخلات من ملف، سواء من نص (string) أو من طرفية المستخدم.
- يُقسَّم المُدخَل إلى كلمات ومُعامِلات وفقًا لقواعد التنصيص (quoting rules) -انظر بيئة Bash-، وتُفصل تلك الوحدات (tokens) بمحارف خاصة (meta characters)، وتُوسَّع الأوامر البديلة (aliases).
- تحلِّل الصدفةُ الوحدات (tokens) إلى أوامر بسيطة ومُجمَّعة.
- تنفِّذ الصدفة توسعات مختلفة لتقسم الواحدات الموسَّعة إلى قوائم من أسماء الملفات والأوامر والوسائط (arguments).
- تتم إعادة التوجيه عند الضرورة، وتُحذف معامِلات إعادة التوجيه وعواملها من قائمة الوسائط (arguments).
- تُنفَّذ الأوامر.
- قد تنتظر الصدفة حتى انتهاء الأمر وتحصِّل حالة خروجه.
أوامر الصدفة
يتكون أمر الصدفة البسيط مثل هذا الأمر الذي سينشئ ثلاثة ملفات باسم file1 و file2 و file3 على الترتيب: touch file1 file2 file3
، من الأمر نفسه متبوعًا بوسائط (arguments) وتفصل بينها مسافات.
أما الأوامر الأكثر تعقيدًا فتتكون من أوامر بسيطة تُرتَّب معًا بطرق مختلفة، فمنها ما يكون في أنبوب (pipeline) بحيث يكون خرج أمر ما هو مُدخل الأمر الثاني، أو في حلقة تكرارية (loop)، أو بناء شَرطي (conditional construct) أو في صور أخرى. إليك بعض الأمثلة:
ls | more
gunzip file.tar.gz | tar xvf -
دوال الصدفة Shell Functions
دوال الصدفة هي طريقة لتجميع الأوامر من أجل تنفيذها لاحقًا باستخدام اسم واحد للمجموعة ككل وتُنفَّذ حينها كأمر عادي. وحين يُستخدم اسم دالة من دوال الصدفة كاسم لأمر بسيط، فإن قائمة الأوامر المرتبطة بتلك الدالة تُنفَّذ. وتُنفَّذ دوال الصدفة داخل السياق الحالي للصدفة دون إنشاء عملية جديدة. انظر الدوال في Bash.
معامِلات الصدفة Shell Parameters
المُعامِل (Parameter) هو وحدة تخزن قيمة ما قد تكون اسمًا أو رقمًا أو قيمة خاصة. وبالنسبة للصدفة فإن المتغير ما هو إلا معامِل يخزِّن اسمًا، ولهذا المتغير قيمة، وقد يكون له خواص (attributes) أو لا، ويستطيع المستخدم إنشاء تلك المتغيرات باستخدام أمر declare
.
وتُعيَّن قيمة فارغة (null string) للمتغير إن لم تُعطَ له أي قِيَم، ولا يمكن حذف المتغير إلا باستخدام أمر unset
. سنناقش تعيين المتغيرات في المتغيرات في Bash، وكذلك الاستخدام المتقدم لها في المزيد حول المتغيرات في Bash.
توسعات الصدفة
تُنفَّذ توسعات الصدفة بعد أن ينقسم كل أمر إلى وحدات (tokens)، وهذه التوسعات هي:
- توسُّع القوسيْن (Brace expansion).
- توسُّع المَدَّة (Tilde expansion).
- توسع المعامِل والمتغيِّر (Parameter and Variable expansion).
- استبدال الأوامر (Command Substitution).
- التوسع الحسابي (Arithmetic expansion).
- انقسام الكلمات (Word splitting).
- توسع اسم الملف (Filename expansion).
وسنناقش تلك التوسعات بالتفصيل في التوسعات في Bash.
إعادة التوجيه
قد يُعاد توجيه مدخلات أمر ومخرجاته قبل تنفيذه باستخدام رمز خاص (special notion) تُفسره الصدفة، وقد تُستخدم إعادة التوجيه أيضًا لفتح وإغلاق ملفات لبيئة تنفيذ الصدفة الحالية.
تنفيذ الأوامر
تُحفظ الكلمات التي تسبق اسم الأمر والتي يحددها المحلِّل (parser) كمُعيَّنات لمتغير، وكذلك الكلمات التي يحددها كإعادة توجيه، فإنها تُحفظ ليُرجع إليها فيما بعد. أما الكلمات التي ليست هذه ولا تلك فإنها تُوسَّع، ثم تُختار أول كلمة متبقية بعد ذلك لتكون اسمًا للأمر وتكون بقية الكلمات وسائط (arguments) لذلك الأمر. ثم بعد ذلك تُنفَّذ إعادة التوجيهات وتُوسَّع النصوص المعيَّنة للمتغيرات، أما إن لم يكن ثَمَّة اسم لأي أمر فإن المتغيرات تؤثر في بيئة الصدفة الحالية.
وكذلك فإن البحث عن الأوامر جزء مهم من مهام الصدفة، وتقوم bash بهذا على النحو التالي:
- تنظر ما إن كان الأمر يحتوي شَرطة مائلة (slash)، وإن لم تجد فإنها تبحث أولًا في قائمة الدوال لترى ما إن كان بها أمرًا بنفس الاسم الذي نبحث عنه.
- إن لم يكن الأمر دالة فإنها تبحث في قائمة الأوامر المضمنة في الصدفة (built-in commands).
- إن لم يكن الأمر دالة ولا أمرًا مُضمَّنًا فإنها تحلل المجلدات الموجودة في متغير
PATH
، إذ تستخدم bash منطقة تخزين للبيانات في الذاكرة اسمها hash table لتخزن بها المسارات الكاملة للأوامر من أجل تجنب عمليات البحث الموسعة فيPATH
. - إن لم ينجح البحث في متغير
PATH
فإن bash تطبع رسالة خطأ وتعطي حالة خروج 127. - إن نجح البحث أو احتوى الأمر على شرطات مائلة فإن الصدفة تنفذ الأمر في بيئة تنفيذ منفصلة.
- إن فشل التنفيذ لأن الملف غير قابل للتنفيذ أو ليس مجلدًا، فإنها تفترض أنه شيفرة نصية للصدفة (shell script).
- إن لم يتم بدء الأمر بشكل غير متزامن (asynchronously)، فإن الصدفة تنتظر انتهاء الأمر ثم تحصّل حالة خروجه (exit status).
شيفرات الصدفة النصية Shell Scripts
حين يُستخدم ملف يحتوي على أوامر للصدفة كأول وسيط غير خياري أثناء استدعاء الصدفة (بدون c-
أو s-
) فإن هذا يفتح صدفة غير تفاعلية، وتبحث تلك الصدفة أولًا عن ملف الشيفرة النصية في المجلد الحالي، ثم في متغير PATH
إن لم تجده في المجلد الحالي.