إنشاء وتشغيل برنامج Bash

من موسوعة حسوب

الكتابة والتسمية

إن كان لديك سلسلة أوامر تنفذها بشكل متكرر وتريد اختصار وقت تنفيذها أو تنفيذها بشكل آلي، فيمكنك وضعها في ملف فارغ يكتب بصيغة معينة وتقرؤه الصدفة على أنه برنامج تنفذه عند استدعاءه بكتابة اسم الملف الذي يحويه، وتسمى تلك البرامج ببرامج الصدفة أو شيفرات الصدفة النصية (Shell Scripts).

ويمكن استخدام تلك البرامج لأتمتة المهام باستخدام أداة cron أو في إجراءات الإقلاع وإيقاف التشغيل في أنظمة يونكس، حيث يُحدَّد أسلوب عمل العفاريت (daemons) والخدمات في شيفرات init النصية (init scripts).

ولإنشاء برنامج للصدفة، افتح ملفًا فارغًا في المحرر النصي الذي تفضله، إذ لا يهم هنا نوع المحرر الذي تستخدمه فأغلبها يقوم بالمهمة التي نريدها الآن، وهي كتابة برنامج لصدفة Bash، فاستخدم VIM إن شئت أو emacs أو gedit أو dtpad أو غير ذلك.

لكن ما قد يجعلك تستخدم محررًا متطورًا مثل VIM أو emacs على ما سواهما هو أنه يمكنك تهيئتهما للتعرف على النصوص التي تكتبها وإبرازها بألوان مختلفة -ومن ذلك نصوص وأوامر الصدفة التي سنكتبها-، وذلك يقلل الأخطاء التي يقع فيها المبتدئون عادة مثل إغفال إغلاق قوسين () أو نسيان الفواصل المنقوطة ; .

إبراز النصوص في VIM

استخدم أحد الأوامر الثلاثة التالية من أجل إبراز النصوص (Text Highlighting) في محرر VIM:

syntax enable: أو sy enable: أو syn enable:

من المفيد إضافة ذلك الإعداد إلى ملف vimrc. من أجل تثبيته كإعداد افتراضي.

ضع أوامر يونكس في الملف الذي أنشأته كما لو كنت ستكتب تلك الأوامر في سطر الأوامر (انظر تنفيذ الأوامر في Bash). يمكن أن تكون تلك الأوامر دوال للصدفة أو أوامر مضمَّنة فيها أو أوامر يونكس أو غير ذلك. والآن أعط ذلك الملف اسمًا يصف المهام التي ينفذها وتأكد ألا يتعارض الاسم مع أوامر موجودة مسبقًا، ولضمان ذلك فإن أسماء برامج الصدفة تنتهي غالبًا بـ sh.، لكن هذا لا يمنع وجود شيفرات نصية أخرى في النظام بنفس الاسم الذي تختاره، فابحث في النظام عن ملفات أو شيفرات نصية بنفس الاسم باستخدام أوامر البحث في الملفات والبرامج مثل which أو whereis:

which -a script_name

whereis script_name

locate script_name

script1.sh

سنستخدم في هذا المثال أمر echo لطباعة إشعارات على الشاشة تخبر المستخدم بما سيحدث قبل أن تُنفّذ كل مهمة، ذلك أن من المهم إخبار المستخدم بما يجري لتجنب فزع المستخدم بسبب أنه يشعر أن البرنامج "لا يفعل أي شيء". انظر تفصيل إشعار المستخدم في كتابة برامج Bash تفاعلية.

الملف script1.sh

#!/bin/bash

clear

echo "The script starts now."

echo "Hi, $USER!"
echo

echo "I will now fetch you a list of conntected users:"
echo
w
echo

echo "I'm setting two variables now."
COLOR="black"
VALUE="9"
echo "This is a string: $COLOR"
echo "And this is a number: $VALUE"
echo

echo "I'm giving you back your prompt now."
echo

ربما يجب أن تدرب نفسك على كتابة برامج للصدفة بكتابة هذا المثال في الصورة بنفسك، كذلك من المفيد إنشاء مجلد scripts/~ لحفظ شيفراتك النصية فيه، ثم أضف ذلك المجلد إلى محتويات المتغير PATH كما يلي:

export PATH="$PATH:~/scripts"

استخدم محررًا يدعم إبراز النصوص لأوامر الصدفة إن كنت مبتدئًا، وستجد تلك الخاصية مدعومة في محررات مثل VIM - gvim - (x)emacs- kwrite إضافة إلى محررات أخرى، لذا تأكد من دعم المحرر الذي تستخدمه لخاصية إبراز النصوص (Text Highlighting) بالنظر في توثيق ذلك المحرر.

المِحثات المختلفة

قد تختلف المِحثَّات المستخدمة في هذا الشرح لتحاكي مواقف الحياة العملية الحقيقية بدلًا عن استخدام محث $ الذي يكثر استخدامه في الشروحات. غير أن محث المستخدم الجذر سيظل ثابتًا في الشرح، وسيكون #.

تنفيذ البرنامج

يكون البرنامج قابلًا للتنفيذ لمن يحق له ذلك، أي لمن يمنح له صاحب البرنامج إذن تنفيذه، فتأكد أن تحصل على الأذونات التي تريدها أثناء ضبط أذونات البرنامج، وبعدها تستطيع تشغيل البرنامج كما تشغِّل أي أمر في الصدفة:

wiki@hsoub:~/scripts$ chmod u+x script1.sh

wiki@hsoub:~/scripts$ ls -l script1.sh 
-rwxrwxr-x 1 wiki wiki 331 Jul 31 03:12 script1.sh

wiki@hsoub:~/scripts$ script1.sh
The script starts now.
Hi, wiki!

I will now fetch you a list of connected users:

 03:12:48 up  3:42,  1 user,  load average: 1.33, 1.51, 1.67
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
wiki     tty7     :0               23:30    3:42m 12:51   0.63s /usr/lib/gnome-session/gnome

I'm setting two variables now.
This is a string: black
And this is a number: 9

I'm giving you back your prompt now.

wiki@hsoub:~/scripts$ echo $COLOUR

wiki@hsoub:~/scripts$ echo $VALUE

wiki@hsoub:~/scripts$

تلك هي أكثر الطرق شيوعًا لتنفيذ برنامج نصي للصدفة، ويُفضَّل تنفيذ مثل تلك البرامج في صدفة فرعية (subshell)، إذ ستكون المتغيرات والدوال والأوامر البديلة (aliases) التي أنشئت في تلك الصدفة الفرعية معرَّفة لهذه الجلسة من Bash لتلك الصدفة الفرعية فقط، ويعود كل شيء كما كان عليه عندما تُغلَق تلك الصدفة ويعود التحكم للصدفة الأم مرة أخرى، إذ يُنَظَّف كل شيء وتلغى كل التغييرات التي أحدثها البرنامج للصدفة. إن لم تضع مجلد scripts في متغير PATH ولم يكن المجلد الحالي . فيه كذلك فيمكنك تنفيذ البرنامج بهذا الأمر -يشير script_name إلى اسم برنامجك-:

./script_name.sh

قد يُنفَّذ البرنامج في صدفة بعينها، رغم أننا نفعل هذا إن أردنا الحصول على سلوك معين مثل تفقّد إن كان البرنامج يعمل في صدفة أخرى أو يطبع آثارًا (traces) من أجل التصحيح (debugging):

rbash script_name.sh

sh script_name.sh

bash -x script_name.sh

ستعمل الصدفة المحددة في أي من الأوامر السابقة كصدفة فرعية من صدفتك الحالية وتنفذ البرنامج، قد تقوم بهذا حين تريد للبرنامج أن يعمل بخيارات محددة أو تحت ظروف لم تُحدّد فيه. أما إن أردت تنفيذ البرنامج داخل نفس الصدفة التي أنت فيها فيجب أن تستخدم أمر source أولًا:

source script_name.sh

source=.

يرادف أمرُ source المٌضمَّن في صدفة Bash أمرَ . في صدفة بورن.

لا تحتاج الصدفة أي أذونات تنفيذ في تلك الحالة، وتُنفَّذ الأوامر في السياق الحالي للصدفة، لذا فإن أي تغييرات تحدث لبيئتك الحالية ستكون ظاهرة وباقية بعد انتهاء تنفيذ البرنامج:

wiki@hsoub:~/scripts$ source script1.sh
wiki@hsoub:~/scripts$ echo $COLOUR
black

wiki@hsoub:~/scripts$ echo $VALUE
9

wiki@hsoub:~/scripts$

انظر أيضًا

مصادر