الفرق بين المراجعتين لصفحة: «Bash/debugging Bash scripts»

من موسوعة حسوب
إضافة 3.0، باقي المحتوى من المصدر والتصانيف
مراجعة 7: تعديل اسم مستخدم الطرفية
 
(7 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:تنقيح برامج Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:تنقيح برامج Bash}}</noinclude>
== التنقيح على مستوى البرنامج ككل==
==التنقيح على مستوى البرنامج ككل==
حين تحدث مشكلة في البرنامج الذي كتبته فإنك في حاجة إلى وضع يدك على مكان المشكلة بالتحديد داخل الشيفرة، وتوفر Bash مزايا تنقيح شاملة لعل أشهرها هو بدء صدفة فرعية بخيار <code>x-</code> الذي سيبدأ الصدفة بالكامل في طور التنقيح، وستُطبَع آثار كل أمر إضافة إلى وسائطه (arguments) إلى خَرج قياسي (standard output) بعد توسيع الأوامر لكن قبل تنفيذها.
حين تحدث مشكلة في البرنامج الذي كتبته فإنك في حاجة إلى وضع يدك على مكان المشكلة بالتحديد داخل الشيفرة، وتوفر Bash مزايا تنقيح شاملة لعل أشهرها هو بدء صدفة فرعية بخيار <code>x-</code> الذي سيبدأ الصدفة بالكامل في طور التنقيح، وستُطبَع آثار كل أمر إضافة إلى وسائطه (arguments) إلى خَرج قياسي (standard output) بعد توسيع الأوامر لكن قبل تنفيذها.


الشيفرة التالية هي لبرنامج <code>commented-script1.sh</code> من مثال [[Bash/script basics|أساسيات كتابة برامج Bash]]، وقد استدعينا الصدفة في طور التنقيح (debug mode)، لاحظ أن التعليقات المضافة ليست مرئية في خرج البرنامج:<syntaxhighlight lang="bash">
الشيفرة التالية هي لبرنامج <code>commented-script1.sh</code> من مثال [[Bash/script basics|أساسيات كتابة برامج Bash]]، وقد استدعينا الصدفة في طور التنقيح (debug mode)، لاحظ أن التعليقات المضافة ليست مرئية في خرج البرنامج:<syntaxhighlight lang="text">
os@inspiron:~/scripts$ bash -x script1.sh
wiki@hsoub:~/scripts$ bash -x script1.sh
+ clear
+ clear


+ echo 'The script starts now.'
+ echo 'The script starts now.'
The script starts now.
The script starts now.
+ echo 'Hi, os!'
+ echo 'Hi, wiki!'
Hi, os!
Hi, wiki!
+ echo
+ echo


سطر 20: سطر 20:
  13:46:40 up 24 min,  1 user,  load average: 0.54, 0.33, 0.23
  13:46:40 up 24 min,  1 user,  load average: 0.54, 0.33, 0.23
USER    TTY      FROM            LOGIN@  IDLE  JCPU  PCPU WHAT
USER    TTY      FROM            LOGIN@  IDLE  JCPU  PCPU WHAT
os       tty7    :0              13:22  23:56  24.22s  0.21s /usr/li
wiki       tty7    :0              13:22  23:56  24.22s  0.21s /usr/li
+ echo
+ echo


سطر 37: سطر 37:
+ echo
+ echo


os@inspiron:~/scripts$  
wiki@hsoub:~/scripts$  
</syntaxhighlight>ويوجد الآن منقِّح للصدفة به مزايا متطورة متاح على [http://bashdb.sourceforge.net/ SourceFourge]، وتلك المزايا موجودة في أغلب الإصدارات الحديثة في الصدفة بدءًا من إصدار 3.1 .
</syntaxhighlight>ويوجد الآن منقِّح للصدفة به مزايا متطورة متاح على [http://bashdb.sourceforge.net/ SourceForge]، وتلك المزايا موجودة في أغلب الإصدارات الحديثة في الصدفة بدءًا من إصدار 3.1 .


== تنقيح أجزاء من الصدفة ==
== تنقيح أجزاء من الصدفة ==
سطر 45: سطر 45:
w
w
set +x # إيقاف التنقيح من هنا
set +x # إيقاف التنقيح من هنا
</syntaxhighlight>وسيكون خرج البرنامج  هكذا:<syntaxhighlight lang="bash">
</syntaxhighlight>وسيكون خرج البرنامج  هكذا:<syntaxhighlight lang="text">
os@inspiron:~/scripts$ commented-script1.sh
wiki@hsoub:~/scripts$ commented-script1.sh


The script starts now.
The script starts now.
Hi, os!
Hi, wiki!


I will now fetch you a list of connected users:
I will now fetch you a list of connected users:
سطر 55: سطر 55:
+ w
+ w
  16:15:53 up  2:10,  1 user,  load average: 1.27, 1.47, 1.11
  16:15:53 up  2:10,  1 user,  load average: 1.27, 1.47, 1.11
USER     TTY      FROM            LOGIN@  IDLE  JCPU  PCPU WHAT
USER       TTY      FROM            LOGIN@  IDLE  JCPU  PCPU WHAT
os       tty7    :0              14:05    2:10m  1:34  0.21s /usr/li
wiki       tty7    :0              14:05    2:10m  1:34  0.21s /usr/li
+ set +x
+ set +x


سطر 65: سطر 65:
I'm giving you back your prompt now.
I'm giving you back your prompt now.


os@inspiron:~/scripts$  
wiki@hsoub:~/scripts$  


</syntaxhighlight>تستطيع إيقاف وتشغيل وضع التنقيح كما تشاء داخل نفس البرنامج بدون حد أقصى لمرات استخدامه. انظر الجدول أدناه حيث تجد بعض الخيارات المفيدة للصدفة:
</syntaxhighlight>تستطيع إيقاف وتشغيل وضع التنقيح كما تشاء داخل نفس البرنامج بدون حد أقصى لمرات استخدامه. انظر الجدول أدناه حيث تجد بعض الخيارات المفيدة للصدفة:


'''جدول 2.1: نظرة عامة على خيارات أمر التنقيح <code>set</code>'''
نظرة عامة على خيارات أمر التنقيح <code>set</code>
{| class="wikitable"
{| class="wikitable"
|الشكل المختصر
!الشكل المختصر
|الشكل المفصّل
!الشكل المفصّل
|النتيجة
!النتيجة
|-
|-
|<code>set -f</code>
|<code>set -f</code>
سطر 88: سطر 88:
|}
|}
تُستخدم الشَّرطة <code>-</code> لتفعيل خيار الصدفة وعلامة الإضافة <code>+</code> لإيقاف تفعيلها، انتبه كي لا تخلط بين العلامتين. انظر المثال التالي لتوضيح استخدامهما:<syntaxhighlight lang="bash">
تُستخدم الشَّرطة <code>-</code> لتفعيل خيار الصدفة وعلامة الإضافة <code>+</code> لإيقاف تفعيلها، انتبه كي لا تخلط بين العلامتين. انظر المثال التالي لتوضيح استخدامهما:<syntaxhighlight lang="bash">
os@inspiron:~/scripts$ set -v
wiki@hsoub:~/scripts$ set -v


os@inspiron:~/scripts$ ls
wiki@hsoub:~/scripts$ ls
ls
ls
commented-scripts.sh script1.sh
commented-scripts.sh script1.sh


os@inspiron:~/scripts$ set +v
wiki@hsoub:~/scripts$ set +v
set +v
set +v


os@inspiron:~/scripts$ ls *
wiki@hsoub:~/scripts$ ls *
commented-script1.sh  script1.sh
commented-script1.sh  script1.sh


os@inspiron:~/scripts$ set -f
wiki@hsoub:~/scripts$ set -f


os@inspiron:~/scripts$ ls *
wiki@hsoub:~/scripts$ ls *
ls: cannot access '*': No such file or directory
ls: cannot access '*': No such file or directory


os@inspiron:~/scripts$ touch *
wiki@hsoub:~/scripts$ touch *


os@inspiron:~/scripts$ ls
wiki@hsoub:~/scripts$ ls
*  commented-script1.sh  script1.sh
*  commented-script1.sh  script1.sh


os@inspiron:~/scripts$ rm *
wiki@hsoub:~/scripts$ rm *


os@inspiron:~/scripts$ ls
wiki@hsoub:~/scripts$ ls
commented-script1.sh  script1.sh
commented-script1.sh  script1.sh


os@inspiron:~/scripts$  
wiki@hsoub:~/scripts$  


</syntaxhighlight>ويمكنك تحديد تلك الأوضاع داخل شيفرة البرنامج نفسه بإضافة الخيارات التي تريدها إلى تصريح الصدفة في السطر الأول -يمكنك جمع الخيارات معًا تمامًا مثل أوامر يونكس- :<syntaxhighlight lang="bash">
</syntaxhighlight>ويمكنك تحديد تلك الأوضاع داخل شيفرة البرنامج نفسه بإضافة الخيارات التي تريدها إلى تصريح الصدفة في السطر الأول -يمكنك جمع الخيارات معًا تمامًا مثل أوامر يونكس- :<syntaxhighlight lang="bash">
سطر 125: سطر 125:


</syntaxhighlight>
</syntaxhighlight>
== ملخص ==
برنامج الصدفة هو سلسلة من الأوامر يعاد استخدامها بشكل متكرر، ووُضعت في ملف نصي له إذن تنفيذ كبرنامج، ويمكن استخدام أي محرر نصي لكتابة برامج لصدفة Bash.
تبدأ برامج bash بـ <code>!#</code> متبوعيْن بمسار الصفة التي ستنفذ الأوامر التي ستُكتب في البرنامج، وتضاف التعليقات إلى البرنامج للمرجعية فيما بعد ولتيسير فهم الشيفرة على من يقرؤها. يُفضل الإسهاب في التعليقات داخل برامج الصدفة على الإيجاز فيها.
تُنقَّح الصدفة باستخدام خيارات الصدفة، ويمكن استخدام تلك الخيارات للتنقيح الجزئي أو لتحليل الشيفرة كاملة، كما أن من الشائع إدخال أمر <code>echo</code> في الأماكن التي يُشتبه فيها العطل من أجل طباعة بيانات عما يحدث في تلك الأماكن.


== انظر أيضًا ==
== انظر أيضًا ==
سطر 139: سطر 132:


== مصادر ==
== مصادر ==
* <span> </span>[http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html دليل Bash للمبتدئين. فصل 2.3، تنقيح برامج Bash].
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html دليل Bash للمبتدئين، <span>صفحة تنقيح برامج Bash </span>].
 
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_05.html دليل Bash للمبتدئين. فصل 2.4، ملخص].
[[تصنيف:Bash]]
[[تصنيف:Bash]]
[[تصنيف:Bash Debugging Scripts]]
[[تصنيف:Bash Debugging Scripts]]
[[تصنيف:Bash Options]]

المراجعة الحالية بتاريخ 07:55، 8 سبتمبر 2018

التنقيح على مستوى البرنامج ككل

حين تحدث مشكلة في البرنامج الذي كتبته فإنك في حاجة إلى وضع يدك على مكان المشكلة بالتحديد داخل الشيفرة، وتوفر Bash مزايا تنقيح شاملة لعل أشهرها هو بدء صدفة فرعية بخيار x- الذي سيبدأ الصدفة بالكامل في طور التنقيح، وستُطبَع آثار كل أمر إضافة إلى وسائطه (arguments) إلى خَرج قياسي (standard output) بعد توسيع الأوامر لكن قبل تنفيذها.

الشيفرة التالية هي لبرنامج commented-script1.sh من مثال أساسيات كتابة برامج Bash، وقد استدعينا الصدفة في طور التنقيح (debug mode)، لاحظ أن التعليقات المضافة ليست مرئية في خرج البرنامج:

wiki@hsoub:~/scripts$ bash -x script1.sh
+ clear

+ echo 'The script starts now.'
The script starts now.
+ echo 'Hi, wiki!'
Hi, wiki!
+ echo

+ echo 'I will now fetch you a list of connected users:'
I will now fetch you a list of connected users:
+ echo

+ w
 13:46:40 up 24 min,  1 user,  load average: 0.54, 0.33, 0.23
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
wiki       tty7     :0               13:22   23:56  24.22s  0.21s /usr/li
+ echo

+ echo 'I'\''m setting two variables now.'
I'm setting two variables now.
+ COLOUR=black
+ VALUE=9
+ echo 'This is a string: black'
This is a string: black
+ echo 'And this is a number: 9'
And this is a number: 9
+ echo

+ echo 'I'\''m giving you back your prompt now.'
I'm giving you back your prompt now.
+ echo

wiki@hsoub:~/scripts$

ويوجد الآن منقِّح للصدفة به مزايا متطورة متاح على SourceForge، وتلك المزايا موجودة في أغلب الإصدارات الحديثة في الصدفة بدءًا من إصدار 3.1 .

تنقيح أجزاء من الصدفة

لنقل أنك لا تعرف ما يفعله أمر w في مثال commented-script1.sh، فنستخدم حينها أمر set لتشغيل البرنامج في الوضع العادي للأجزاء التي نعرف أنها بدون أخطاء، وعرض معلومات تنقيح عن الأجزاء التي بها مشاكل فقط، ففي مثالنا هنا نريد أن نعرف وظيفة أمر w، فنضع إشارة بدء التنقيح قبله وإنهاء التنقيح بعده، كما يلي:

set -x			# بدء التنقيح من هنا
w
set +x			# إيقاف التنقيح من هنا

وسيكون خرج البرنامج هكذا:

wiki@hsoub:~/scripts$ commented-script1.sh

The script starts now.
Hi, wiki!

I will now fetch you a list of connected users:

+ w
 16:15:53 up  2:10,  1 user,  load average: 1.27, 1.47, 1.11
USER       TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
wiki       tty7     :0               14:05    2:10m  1:34   0.21s /usr/li
+ set +x

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$

تستطيع إيقاف وتشغيل وضع التنقيح كما تشاء داخل نفس البرنامج بدون حد أقصى لمرات استخدامه. انظر الجدول أدناه حيث تجد بعض الخيارات المفيدة للصدفة:

نظرة عامة على خيارات أمر التنقيح set

الشكل المختصر الشكل المفصّل النتيجة
set -f set -o noglob يعطل توليد اسم الملف باستخدام المحارف الخاصة (التجميع globbing).
st -v set -o verbose يطبع أسطر مدخلات الصدفة كما تُقرأ.
set -x set -o xtrace يطبع آثار الأمر قبل تنفيذه.

تُستخدم الشَّرطة - لتفعيل خيار الصدفة وعلامة الإضافة + لإيقاف تفعيلها، انتبه كي لا تخلط بين العلامتين. انظر المثال التالي لتوضيح استخدامهما:

wiki@hsoub:~/scripts$ set -v

wiki@hsoub:~/scripts$ ls
ls
commented-scripts.sh	script1.sh

wiki@hsoub:~/scripts$ set +v
set +v

wiki@hsoub:~/scripts$ ls *
commented-script1.sh  script1.sh

wiki@hsoub:~/scripts$ set -f

wiki@hsoub:~/scripts$ ls *
ls: cannot access '*': No such file or directory

wiki@hsoub:~/scripts$ touch *

wiki@hsoub:~/scripts$ ls
*  commented-script1.sh  script1.sh

wiki@hsoub:~/scripts$ rm *

wiki@hsoub:~/scripts$ ls
commented-script1.sh  script1.sh

wiki@hsoub:~/scripts$

ويمكنك تحديد تلك الأوضاع داخل شيفرة البرنامج نفسه بإضافة الخيارات التي تريدها إلى تصريح الصدفة في السطر الأول -يمكنك جمع الخيارات معًا تمامًا مثل أوامر يونكس- :

#!/bin/bash -xv

وبمجرد أن تجد ذلك الجزء الذي يسبب مشكلة في شيفرتك، يمكنك حينها أن تضع أمر echo لعرض محتويات المتغيرات في مراحل مختلفة من الشيفرة كي تضع يدك على الأخطاء:

echo "Variable VARNAME is now set to $VARNAME."

انظر أيضًا

مصادر