الفرق بين المراجعتين لصفحة: «Bash/creating and running a script»
أسامه-دمراني (نقاش | مساهمات) إدخال أولي وتنسيق. |
أسامه-دمراني (نقاش | مساهمات) مراجعة 6: إضافة تصانيف |
||
(11 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: | <noinclude>{{DISPLAYTITLE:إنشاء وتشغيل برنامج Bash}}</noinclude> | ||
== الكتابة والتسمية == | == الكتابة والتسمية == | ||
إن كان لديك سلسلة أوامر تنفذها بشكل متكرر وتريد اختصار وقت تنفيذها أو تنفيذها بشكل آلي، فيمكنك وضعها في ملف فارغ يكتب بصيغة معينة وتقرؤه الصدفة على أنه برنامج تنفذه عند استدعاءه بكتابة اسم الملف الذي يحويه، وتسمى تلك البرامج ببرامج الصدفة أو شيفرات الصدفة النصية (Shell Scripts). | إن كان لديك سلسلة أوامر تنفذها بشكل متكرر وتريد اختصار وقت تنفيذها أو تنفيذها بشكل آلي، فيمكنك وضعها في ملف فارغ يكتب بصيغة معينة وتقرؤه الصدفة على أنه برنامج تنفذه عند استدعاءه بكتابة اسم الملف الذي يحويه، وتسمى تلك البرامج ببرامج الصدفة أو شيفرات الصدفة النصية (Shell Scripts). | ||
سطر 6: | سطر 5: | ||
ويمكن استخدام تلك البرامج لأتمتة المهام باستخدام أداة <code>cron</code> أو في إجراءات الإقلاع وإيقاف التشغيل في أنظمة يونكس، حيث يُحدَّد أسلوب عمل العفاريت (daemons) والخدمات في شيفرات init النصية (init scripts). | ويمكن استخدام تلك البرامج لأتمتة المهام باستخدام أداة <code>cron</code> أو في إجراءات الإقلاع وإيقاف التشغيل في أنظمة يونكس، حيث يُحدَّد أسلوب عمل العفاريت (daemons) والخدمات في شيفرات init النصية (init scripts). | ||
ولإنشاء برنامج للصدفة، افتح ملفًا فارغًا في المحرر النصي الذي تفضله، إذ لا يهم هنا نوع المحرر الذي تستخدمه فأغلبها يقوم بالمهمة التي نريدها الآن، وهي كتابة برنامج لصدفة | ولإنشاء برنامج للصدفة، افتح ملفًا فارغًا في المحرر النصي الذي تفضله، إذ لا يهم هنا نوع المحرر الذي تستخدمه فأغلبها يقوم بالمهمة التي نريدها الآن، وهي كتابة برنامج لصدفة Bash، فاستخدم VIM إن شئت أو emacs أو gedit أو dtpad أو غير ذلك. | ||
لكن ما قد يجعلك تستخدم محررًا متطورًا مثل | لكن ما قد يجعلك تستخدم محررًا متطورًا مثل VIM أو emacs على ما سواهما هو أنه يمكنك تهيئتهما للتعرف على النصوص التي تكتبها وإبرازها بألوان مختلفة -ومن ذلك نصوص وأوامر الصدفة التي سنكتبها-، وذلك يقلل الأخطاء التي يقع فيها المبتدئون عادة مثل إغفال إغلاق قوسين <code>()</code> أو نسيان الفواصل المنقوطة <code>;</code> .<blockquote>'''إبراز النصوص في VIM'''</blockquote><blockquote>استخدم أحد الأوامر الثلاثة التالية من أجل إبراز النصوص (Text Highlighting) في محرر VIM:</blockquote><blockquote><code>syntax enable:</code> أو <code>sy enable:</code> أو <code>syn enable:</code></blockquote><blockquote>من المفيد إضافة ذلك الإعداد إلى ملف <code>vimrc.</code> من أجل تثبيته كإعداد افتراضي.</blockquote>ضع أوامر يونكس في الملف الذي أنشأته كما لو كنت ستكتب تلك الأوامر في سطر الأوامر (انظر [[Bash/executing commands|تنفيذ الأوامر في Bash]]). يمكن أن تكون تلك الأوامر دوال للصدفة أو أوامر مضمَّنة فيها أو أوامر يونكس أو غير ذلك. | ||
والآن أعط ذلك الملف اسمًا يصف المهام التي ينفذها وتأكد ألا يتعارض الاسم مع أوامر موجودة مسبقًا، ولضمان ذلك فإن أسماء برامج الصدفة تنتهي غالبًا بـ <code>sh.</code>، لكن هذا لا يمنع وجود شيفرات نصية أخرى في النظام بنفس الاسم الذي تختاره، فابحث في النظام عن ملفات أو شيفرات نصية بنفس الاسم باستخدام أوامر البحث في الملفات والبرامج مثل <code>which</code> أو <code>whereis</code>:<syntaxhighlight lang="bash"> | والآن أعط ذلك الملف اسمًا يصف المهام التي ينفذها وتأكد ألا يتعارض الاسم مع أوامر موجودة مسبقًا، ولضمان ذلك فإن أسماء برامج الصدفة تنتهي غالبًا بـ <code>sh.</code>، لكن هذا لا يمنع وجود شيفرات نصية أخرى في النظام بنفس الاسم الذي تختاره، فابحث في النظام عن ملفات أو شيفرات نصية بنفس الاسم باستخدام أوامر البحث في الملفات والبرامج مثل <code>which</code> أو <code>whereis</code>:<syntaxhighlight lang="bash"> | ||
which -a script_name | which -a script_name | ||
whereis script_name | whereis script_name | ||
locate script_name | locate script_name | ||
</syntaxhighlight>< | |||
</syntaxhighlight> | |||
== script1.sh == | |||
سنستخدم في هذا المثال أمر <code>echo</code> لطباعة إشعارات على الشاشة تخبر المستخدم بما سيحدث قبل أن تُنفّذ كل مهمة، ذلك أن من المهم إخبار المستخدم بما يجري لتجنب فزع المستخدم بسبب أنه يشعر أن البرنامج "لا يفعل أي شيء". انظر تفصيل إشعار المستخدم في كتابة برامج Bash تفاعلية. | |||
'''الملف script1.sh'''<syntaxhighlight lang="bash"> | |||
#!/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 | |||
</syntaxhighlight>ربما يجب أن تدرب نفسك على كتابة برامج للصدفة بكتابة هذا المثال في الصورة بنفسك، كذلك من المفيد إنشاء مجلد <code>scripts/~</code> لحفظ شيفراتك النصية فيه، ثم أضف ذلك المجلد إلى محتويات المتغير <code>PATH</code> كما يلي:<syntaxhighlight lang="bash"> | |||
export PATH="$PATH:~/scripts" | |||
</syntaxhighlight>استخدم محررًا يدعم إبراز النصوص لأوامر الصدفة إن كنت مبتدئًا، وستجد تلك الخاصية مدعومة في محررات مثل VIM - gvim - (x)emacs- kwrite إضافة إلى محررات أخرى، لذا تأكد من دعم المحرر الذي تستخدمه لخاصية إبراز النصوص (Text Highlighting) بالنظر في توثيق ذلك المحرر.<blockquote>'''المِحثات المختلفة'''</blockquote><blockquote>قد تختلف المِحثَّات المستخدمة في هذا الشرح لتحاكي مواقف الحياة العملية الحقيقية بدلًا عن استخدام محث <code>$</code> الذي يكثر استخدامه في الشروحات. غير أن محث المستخدم الجذر سيظل ثابتًا في الشرح، وسيكون <code>#</code>.</blockquote> | |||
== تنفيذ البرنامج == | |||
يكون البرنامج قابلًا للتنفيذ لمن يحق له ذلك، أي لمن يمنح له صاحب البرنامج إذن تنفيذه، فتأكد أن تحصل على الأذونات التي تريدها أثناء ضبط أذونات البرنامج، وبعدها تستطيع تشغيل البرنامج كما تشغِّل أي أمر في الصدفة:<syntaxhighlight lang="text"> | |||
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$ | |||
</syntaxhighlight>تلك هي أكثر الطرق شيوعًا لتنفيذ برنامج نصي للصدفة، ويُفضَّل تنفيذ مثل تلك البرامج في صدفة فرعية (subshell)، إذ ستكون المتغيرات والدوال والأوامر البديلة (aliases) التي أنشئت في تلك الصدفة الفرعية معرَّفة لهذه الجلسة من Bash لتلك الصدفة الفرعية فقط، ويعود كل شيء كما كان عليه عندما تُغلَق تلك الصدفة ويعود التحكم للصدفة الأم مرة أخرى، إذ يُنَظَّف كل شيء وتلغى كل التغييرات التي أحدثها البرنامج للصدفة. | |||
إن لم تضع مجلد scripts في متغير <code>PATH</code> ولم يكن المجلد الحالي <code>.</code> فيه كذلك فيمكنك تنفيذ البرنامج بهذا الأمر -يشير script_name إلى اسم برنامجك-:<syntaxhighlight lang="bash"> | |||
./script_name.sh | |||
</syntaxhighlight>قد يُنفَّذ البرنامج في صدفة بعينها، رغم أننا نفعل هذا إن أردنا الحصول على سلوك معين مثل تفقّد إن كان البرنامج يعمل في صدفة أخرى أو يطبع آثارًا (traces) من أجل التصحيح (debugging):<syntaxhighlight lang="bash"> | |||
rbash script_name.sh | |||
sh script_name.sh | |||
bash -x script_name.sh | |||
</syntaxhighlight>ستعمل الصدفة المحددة في أي من الأوامر السابقة كصدفة فرعية من صدفتك الحالية وتنفذ البرنامج، قد تقوم بهذا حين تريد للبرنامج أن يعمل بخيارات محددة أو تحت ظروف لم تُحدّد فيه. أما إن أردت تنفيذ البرنامج داخل نفس الصدفة التي أنت فيها فيجب أن تستخدم أمر <code>source</code> أولًا:<syntaxhighlight lang="bash"> | |||
source script_name.sh | |||
</syntaxhighlight><blockquote>'''source=.'''</blockquote><blockquote>يرادف أمرُ <code>source</code> المٌضمَّن في صدفة Bash أمرَ <code>.</code> في صدفة بورن.</blockquote>لا تحتاج الصدفة أي أذونات تنفيذ في تلك الحالة، وتُنفَّذ الأوامر في السياق الحالي للصدفة، لذا فإن أي تغييرات تحدث لبيئتك الحالية ستكون ظاهرة وباقية بعد انتهاء تنفيذ البرنامج:<syntaxhighlight lang="bash"> | |||
wiki@hsoub:~/scripts$ source script1.sh | |||
wiki@hsoub:~/scripts$ echo $COLOUR | |||
black | |||
wiki@hsoub:~/scripts$ echo $VALUE | |||
9 | |||
wiki@hsoub:~/scripts$ | |||
</syntaxhighlight> | |||
== انظر أيضًا == | |||
* [[Bash/developing good scripts|تطوير برامج Bash جيدة]]. | |||
* [[Bash/aliases|الأوامر البديلة]]. | |||
* [[Bash/conditional statements|البُنى الشرطية في Bash]]. | |||
== مصادر == | |||
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html دليل Bash للمبتدئين، صفحة إنشاء وتشغيل برنامج Bash]. | |||
[[تصنيف:Bash]] | |||
[[تصنيف:Bash Scripts]] | |||
[[تصنيف:Bash Writing Scripts]] | |||
[[تصنيف:Bash Aliases]] |
المراجعة الحالية بتاريخ 14:39، 6 سبتمبر 2018
الكتابة والتسمية
إن كان لديك سلسلة أوامر تنفذها بشكل متكرر وتريد اختصار وقت تنفيذها أو تنفيذها بشكل آلي، فيمكنك وضعها في ملف فارغ يكتب بصيغة معينة وتقرؤه الصدفة على أنه برنامج تنفذه عند استدعاءه بكتابة اسم الملف الذي يحويه، وتسمى تلك البرامج ببرامج الصدفة أو شيفرات الصدفة النصية (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$