الفرق بين المراجعتين ل"Bash/examples of functions in scripts"
أسامه-دمراني (نقاش | مساهمات) (إدخال أولي وتنسيق) |
أسامه-دمراني (نقاش | مساهمات) (مراجعة 6: إضافة تصانيف وحذف الملخص -نُقل إلى الصفحة الرئيسية للباب) |
||
(5 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
+ | <noinclude>{{DISPLAYTITLE:أمثلة عن الدوال في Bash}}</noinclude> | ||
== إعادة التدوير == | == إعادة التدوير == | ||
− | ستجد برامج كثيرة على نظامك تستخدم الدوال كطريقة منظمة لمعالجة سلسلة ما من الأوامر، ففي بعض أنظمة لينكس مثلًا ستجد الملف التعريفي <code>etc/rc.d/init/functions/</code> يشار إليه كمصدر في كل شيفرات init النصية. | + | ستجد برامج كثيرة على نظامك تستخدم الدوال كطريقة منظمة لمعالجة سلسلة ما من الأوامر، ففي بعض أنظمة لينكس مثلًا ستجد الملف التعريفي <code>etc/rc.d/init/functions/</code> يشار إليه كمصدر في كل شيفرات init النصية. وبهذا الأسلوب لا تحتاج إلى كتابة المهام المتكررة سوى مرة واحدة وبشكل عام أيضًا، مهام مثل تفقد ما إن كانت تعمل إحدى المهام، تشغيل أو إيقاف أحد العفاريت (daemons)، وهلم جرا. ثم إذا دعت الحاجة إلى كتابة تلك المهام مرة أخرى فإنك لا تحتاج سوى إعادة تدوير الشيفرة فقط وليس كتابتها من الصفر. |
− | |||
− | وبهذا الأسلوب لا تحتاج إلى كتابة المهام المتكررة سوى مرة واحدة وبشكل عام أيضًا، مهام مثل تفقد ما إن كانت تعمل إحدى المهام، تشغيل أو إيقاف أحد العفاريت (daemons)، وهلم جرا. ثم إذا دعت الحاجة إلى كتابة تلك المهام مرة أخرى فإنك لا تحتاج سوى إعادة تدوير الشيفرة | ||
وتستطيع إنشاء ملف <code>etc/functions/</code> الخاص بك، والذي سيحتوي كل الدوال التي تستخدمها بانتظام على نظامك والتي قد تكون موزعة على شيفرات مختلفة. وبمجرد أن يكون لديك هذا الملف تستطيع الإشارة إليه في أي برنامج (script) تكتبه بوضع هذا السطر في مكان ما في بداية البرنامج، ثم يمكنك تدوير الدوال بعدها:<syntaxhighlight lang="bash"> | وتستطيع إنشاء ملف <code>etc/functions/</code> الخاص بك، والذي سيحتوي كل الدوال التي تستخدمها بانتظام على نظامك والتي قد تكون موزعة على شيفرات مختلفة. وبمجرد أن يكون لديك هذا الملف تستطيع الإشارة إليه في أي برنامج (script) تكتبه بوضع هذا السطر في مكان ما في بداية البرنامج، ثم يمكنك تدوير الدوال بعدها:<syntaxhighlight lang="bash"> | ||
سطر 100: | سطر 99: | ||
− | </syntaxhighlight>لكن إن كنت تريد النتائج التي يمكن استعادتها عند فشل البرنامج، فإن ذلك الأمر المختصر لن | + | </syntaxhighlight>لكن إن كنت تريد النتائج التي يمكن استعادتها عند فشل البرنامج، فإن ذلك الأمر المختصر لن يفيدك، وأيضًا فإن تعبير '''<code>command &> file</code>''' يماثل تعبيرَ <code>'''command''' '''> file 2>&1'''</code>'''.''' |
+ | |||
+ | == انظر أيضًا == | ||
+ | * [https://wiki.hsoub.com/index.php?title=Bash/writing_and_debugging_scripts كتابة وتنقيح برامج Bash] | ||
+ | * [https://wiki.hsoub.com/index.php?title=Bash/regular_expressions التعابير النمطية في Bash] | ||
+ | * [https://wiki.hsoub.com/index.php?title=Bash/writing_interactive_scripts كتابة برامج Bash تفاعلية] | ||
− | + | == مصادر == | |
+ | * [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_11_02.html دليل Bash للمبتدئين، صفحة أمثلة عن الدوال في Bash] | ||
+ | [[تصنيف:Bash]] | ||
+ | [[تصنيف:Bash Functions]] | ||
+ | [[تصنيف:Bash Init]] | ||
+ | [[تصنيف:Bash Echo Command]] | ||
+ | [[تصنيف:Bash Arguments]] | ||
+ | [[تصنيف:Bash Cron]] |
المراجعة الحالية بتاريخ 00:55، 7 سبتمبر 2018
إعادة التدوير
ستجد برامج كثيرة على نظامك تستخدم الدوال كطريقة منظمة لمعالجة سلسلة ما من الأوامر، ففي بعض أنظمة لينكس مثلًا ستجد الملف التعريفي etc/rc.d/init/functions/
يشار إليه كمصدر في كل شيفرات init النصية. وبهذا الأسلوب لا تحتاج إلى كتابة المهام المتكررة سوى مرة واحدة وبشكل عام أيضًا، مهام مثل تفقد ما إن كانت تعمل إحدى المهام، تشغيل أو إيقاف أحد العفاريت (daemons)، وهلم جرا. ثم إذا دعت الحاجة إلى كتابة تلك المهام مرة أخرى فإنك لا تحتاج سوى إعادة تدوير الشيفرة فقط وليس كتابتها من الصفر.
وتستطيع إنشاء ملف etc/functions/
الخاص بك، والذي سيحتوي كل الدوال التي تستخدمها بانتظام على نظامك والتي قد تكون موزعة على شيفرات مختلفة. وبمجرد أن يكون لديك هذا الملف تستطيع الإشارة إليه في أي برنامج (script) تكتبه بوضع هذا السطر في مكان ما في بداية البرنامج، ثم يمكنك تدوير الدوال بعدها:
. /etc/functions
ضبط المسار
قد تجد هذا الجزء لديك في ملف etc/profile/
. هنا تُحدَّد دالة pathmung
ثم تستخدم لضبط المسار للمستخدم الجذر وبقية المستخدمين:
pathmunge () {
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}
# Path manipulation
if [ `id -u` = 0 ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
fi
pathmunge /usr/X11R6/bin after
unset pathmunge
وتأخذ تلك الدالة أول وسيط (argument) لها ليكون اسمًا للمسار، ويضاف اسم هذا المسار إلى المسار الحالي إن لم يكن موجودًا من قبل، أما الوسيط الثاني فيحدد إن كان المسار سيضاف قبل أو بعد تعريف متغير PATH
الحالي. ولا يضاف لمسار المستخدم العادي إلا usr/X11R6/bin/
، أما المستخدم الجذر فيحصل على بعض المجلدات الإضافية التي تحتوي أوامر للنظام. ويُلغى ضبط الدالة بعد استخدامها كي لا تظل موجودة.
النسخ الاحتياطي عن بعد
يُستخدم المثال الآتي في إنشاء نسخ احتياطية لكتب، ويعتمد مفاتيح SSH لفتح الاتصال عن بعد. تُحدد هنا دالتان هما buplinux
و bupbash
، وتنشئ كل واحدة منهما ملف tar. يُضغط بعدها ويُرسل إلى خادم عن بعد، ثم تُمسح النسخة المحلية بعد ذلك. وتم ضبط البرنامج لينفِّذ دالة bupbash
فقط في يوم الأحد.
#/bin/bash
LOGFILE="/nethome/tille/log/backupscript.log"
echo "Starting backups for `date`" >> "$LOGFILE"
buplinux()
{
DIR="/nethome/tille/xml/db/linux-basics/"
TAR="Linux.tar"
BZIP="$TAR.bz2"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"
cd "$DIR"
tar cf "$TAR" src/*.xml src/images/*.png src/images/*.eps
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"
echo -e "Done backing up Linux course:\nSource files, PNG and EPS images.\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}
bupbash()
{
DIR="/nethome/tille/xml/db/"
TAR="Bash.tar"
BZIP="$TAR.bz2"
FILES="bash-programming/"
SERVER="rincewind"
RDIR="/var/www/intra/tille/html/training/"
cd "$DIR"
tar cf "$TAR" "$FILES"
echo "Compressing $TAR..." >> "$LOGFILE"
bzip2 "$TAR"
echo "...done." >> "$LOGFILE"
echo "Copying to $SERVER..." >> "$LOGFILE"
scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1
echo "...done." >> "$LOGFILE"
echo -e "Done backing up Bash course:\n$FILES\nRubbish removed." >> "$LOGFILE"
rm "$BZIP"
}
DAY=`date +%w`
if [ "$DAY" -lt "2" ]; then
echo "It is `date +%A`, only backing up Bash course." >> "$LOGFILE"
bupbash
else
buplinux
bupbash
fi
echo -e "Remote backup `date` SUCCESS\n----------" >> "$LOGFILE"
يعمل هذا البرنامج عبر cron، بمعنى أنه يعمل دون تدخل المستخدم، لهذا فإننا نعيد توجيه الخطأ القياسي من أمر scp
إلى dev/null/
.
وربما يرى البعض أن كل الخطوات المنفصلة تلك يمكن دمجها في أمر مثل:
tar c dir_to_backup/ | bzip2 | ssh server "cat > backup.tar.bz2"
لكن إن كنت تريد النتائج التي يمكن استعادتها عند فشل البرنامج، فإن ذلك الأمر المختصر لن يفيدك، وأيضًا فإن تعبير command &> file
يماثل تعبيرَ command > file 2>&1
.