<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/?d=4</link><description>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</description><language>ar</language><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x641;&#x64A;&#x62F; &#x645;&#x646; &#x62D;&#x627;&#x633;&#x648;&#x628;&#x643; &#x627;&#x644;&#x642;&#x62F;&#x64A;&#x645;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D9%81%D9%8A%D8%AF-%D9%85%D9%86-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%83-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85-r852/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2026_03/Untitleddesign(1).png.5524c6baa89b08bccef7b2cb65c5169a.png" /></p>
<p>
	تشير <a href="https://geomar.net.pl/en/blog/eko_rozwoj/240-million-pcs-will-become-e-waste-when-windows-10-support-ends/#:~:text=Microsoft's%20end%20of%20Windows%2010,capabilities%20in%20the%20tech%20industry." rel="external nofollow">بعض التقديرات</a> إلى أن 240 مليون حاسوب سيصبح خارج الخدمة بين عشية وضحاها بسبب فقد الدعم البرمجي مع انتهاء دعم نظام ويندوز 10 واشتراطات ويندوز 11 الصارمة للحواسيب التي يقبل التثبيت عليها -مثل TPM 2.0- إضافة إلى مشاكله المتعلقة بخصوصية بيانات المستخدمين وإلحاحه المستمر عليك لاستخدام خدمات مايكروسوفت منذ اللحظة التي تثبت فيها النظام، بدءًا من اشتراط حساب في مايكروسوفت عند التثبيت إلى مزامنة بياناتك في OneDrive إلى CoPilot الذي يصعب إلغاء تفعيله.
</p>

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

<h2 id="-">
	لماذا لم ينتشر لينكس من قبل؟
</h2>

<p>
	قبل أن نفصل في الفوائد التي ستجنيها من تثبيت لينكس على حاسوبك القديم ينبغي أن نجيب على السؤال الذي سيطرح نفسه على من يفكر في الانتقال إلى نظام بديل عن الذي تعود عليه لسنوات، وهو سبب قلة انتشار لينكس على الحواسيب قبل هذه الظاهرة الجديدة لويندوز 11، أليس منطقيًا أن ينتشر وتستخدمه فئة لا بأس بها من الناس إن كان بديلًا قويًا لويندوز؟ فما الذي يضمن لي أن ينفذ المهام التي أحتاج إليها في عملي أو حياتي الشخصية؟
</p>

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

<p>
	فنظام أندرويد مثلًا هو أحد الأنظمة المبنية على لينكس، وأغلب الأجهزة المنزلية الحديثة مثل أجهزة التلفاز وغيرها تشغلها أنظمة لينكس وإن كان المستخدم العادي لا يتعامل معه مباشرة في بعض الأحيان، وجميع الحواسيب الخارقة تقريبًا تعمل بأنظمة لينكس، وما بقي الآن إلا الحواسيب المكتبية والمحمولة.
</p>

<p>
	والسبب الذي جعل انتشاره بطيئًا في هذه الفئة وفقًا لرأي لينوس تورفالدز -مبتكر نواة لينكس- هو نفس سبب انتشارها الساحق في الأجهزة الأخرى، أن هذه الأجهزة تأتي بنظام لينكس مثبت مسبقًا عليها، أما الحواسيب المكتبية فالغالب أنها تأتي بدون نظام تشغيل أو مع نظام تشغيل ويندوز.
</p>

<p>
	وقد كانت أنظمة لينكس تحتاج إلى بعض التعود عليها قديمًا إذا كان المستخدم قادمًا من بيئة ويندوز، لكن تلاشى هذا الفارق تقريبًا هذه الأيام مع تشابه بعض واجهات لينكس مع نظامي ويندوز وماكنتوش، بل صارت لدينا توزيعات صممت لتشبه نظام ويندوز إلى حد التطابق في الواجهة المرئية لتخفيف صدمة الانتقال إلى لينكس.
</p>

<h2 id="-">
	هل سيعمل لينكس على حاسوبي القديم؟
</h2>

<p>
	يستهلك نظام ويندوز في العادة بين 2-4 جيجابايت من الذاكرة العشوائية (الرام) دون استخدام الحاسوب فعليًا في تنفيذ أي مهام، بينما تستهلك أنظمة لينكس ذات الواجهات الخفيفة مثل XFCE أو LXQt حوالي 500 - 800 ميجابايت فقط، مما يترك لك مساحة أكبر في الذاكرة للمهام والبرامج التي ستعمل عليها. إليك بعض الأمثلة الأخرى التي تتميز فيها أنظمة لينكس:
</p>

<h3 id="-">
	تقليل الضغط على المعالج
</h3>

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

<h3 id="-">
	الأمان من الفيروسات
</h3>

<p>
	تستهلك مضادات الفيروسات جزءًا كبيرًا من طاقة الحاسوب مما يؤثر على أدائه من ناحية وعلى عمر بطاريته إن كان حاسوبًا محمولًا، لكنك لن تحتاج إلى هذا مع أنظمة لينكس بسبب بنيته القائمة على مبدأ الصلاحيات، إذ لا يعمل أي ملف فيه دون إذن مسبق من المستخدم، وعليه فلن تحتاج إلى تشغيل مضاد فيروسات في الخلفية.
</p>

<h3 id="-">
	خفة النظام وسرعته
</h3>

<p>
	يعتمد نظام ويندوز -وماك أيضًا- بكثافة على معالج رسوميات GPU لعرض مؤثرات بصرية للمستخدم مثل الظلال والشفافية وغيرها، وصحيح أن هذا موجود في أنظمة لينكس بل وربما أكثر من هذين النظامين، إلا أن الجميل في لينكس هو كثرة الخيارات المتكاملة المتاحة في هذا الشأن، فتستطيع استخدام واجهات خفيفة للغاية لا تكاد تستهلك شيئًا من موارد الحاسوب مقارنة بنظام ويندوز، ومن ثم لا تحتاج إلى معالج رسوميات قوي لتشغيله، بل تستطيع استخدام لينكس دون واجهة رسومية أصلًا إن شئت العمل من بيئة سطر الأوامر!
</p>

<p>
	ولقد جربت هذا في العديد من الحواسيب القديمة التي لدي على اختلاف أنواعها وأجيالها، فمنها حواسيب مكتبية من أوائل التسعينيات حرفيًا إلى أجيال من بداية الألفية، وحواسيب محمولة أعمارها تتراوح بين 15 وعشرين عامًا، وكنت أجد توزيعة لينكس تعمل بكفاءة على أي من هذه الحواسيب مهما كانت إمكانياته قديمة أو ضعيفة بسبب كثرة الخيارات المتاحة من التوزيعات المختلفة.
</p>

<h3 id="-hdd">
	مشاكل أقراص HDD
</h3>

<p>
	يعاني نظام ويندوز من مشكلة تجزئة الملفات fragmentation مع الأقراص الصلبة القديمة من نوع HDD بسبب نظام ملفات NTFS الذي يستخدمه، أما أنظمة لينكس فتستخدم أنظمة ملفات أسرع ولا تعاني من هذه المشكلة، مثل ext4 أو Btrfs.
</p>

<h3 id="-">
	الاستقرار البرمجي
</h3>

<p>
	لا شك أنك واجهت شاشة الموت الزرقاء في ويندوز مرة واحدة على الأقل، أو فتحته لتعمل عليه فوجدت النظام قد سقط فجأة ودون إنذار، وهي مشكلة تكاد تكون معدومة في أنظمة لينكس إذ هي مستقرة إلى أبعد الحدود، ويحتوي متجر البرامج على آلاف البرامج والأدوات المجانية والمدفوعة التي تستطيع تثبيتها مباشرة من المتجر بضغطة زر دون الحاجة إلى حساب للمتجر أو تحديث تلك البرمجيات يدويًا لاحقًا.
</p>

<p>
	وهذا يجعل تجربة الاستخدام أفضل من ناحية، وأكثر استقرارًا من ناحية أخرى إذ أن نسخة البرنامج الموجودة في متجر التوزيعة قد اختبرت وتم التأكد من توافقها مع النظام وأنها لن تسبب مشاكل معه في المستقبل تتسبب في بطئه أو تعطله، بل إذا حاولت تثبيت برنامج حملته من الإنترنت سينبهك النظام إلى النسخة الموجودة في متجر التوزيعة لتثبيتها إذ تكون أفضل أداءً حتى لو كانت أقدم في الإصدار.
</p>

<h3 id="-">
	أنظمة لينكس حرة ومجانية
</h3>

<p>
	ربما تكون هذه هي النقطة التي ينبغي أن نبدأ بها قائمة المزايا في العادة، لكن بما أننا نتحدث عن الحواسيب ذات العتاد القديم فقد رأينا أن نؤجلها قليلًا، ولعلها أفضل ما في أنظمة لينكس، أي أنها أنظمة حرة من ناحية ومفتوحة المصدر بحيث يمكن لأي كان أن يطلع على الشيفرة المصدرية الخاصة بها ويتأكد إن كان له خلفية برمجية أن النظام ليس به أدوات تجسس خفية، وأن الغالب الأعم منها إصدارات مجانية لا تحتاج إلى شراء نسخة للنظام أو ترقيات كل فترة، وينطبق نفس المبدأ على أغلب البرمجيات المتاحة في متجر التطبيقات كذلك، فلا توجد حاجة إلى استخدام برمجيات مقرصنة غير مأمونة.
</p>

<h2 id="-">
	ماذا عن البرامج التي أستخدمها؟
</h2>

<p>
	صحيح أنك قد لا تجد بعض البرامج المتخصصة التي اعتدت عليها في نظام ويندوز مثل طقم المكتب Ms Office مثلًا، لكن أغلب البرامج مغلقة المصدر أو التي تعمل على نظام ويندوز إما لها نسخ لأنظمة لينكس ستجدها في متجر التطبيقات الخاص بالنظام أو على الموقع الخاص بالجهة المطورة للتطبيق أو البرنامج، كما في حالة المتصفحات مثلًا، أو برامج بديلة تؤدي وظيفتها مثل المتصفحات ومحررات النصوص ومشغلات الصوت والفيديو وغيرها، كما في حالة أطقم المكتب حيث ستجد طقم ليبر أوفيس وأوبن أوفيس المقابلين لمكتب ويندوز MS Office.
</p>

<p>
	حتى في حالة البرامج المتخصصة قد تجد إما نسخة منها تعمل على الويب في المتصفح بغض النظر عن نظام التشغيل التي تعتمد عليه، أو برامج بديلة له، فمثلًا لدينا <a href="https://academy.hsoub.com/design/graphic/gimp/" rel="">برنامج جِمب GIMP</a> البديل لبرنامج فوتوشوب، و<a href="https://academy.hsoub.com/design/illustration/inkscape/" rel="">برنامج إنكسكيب Inkscape</a> البديل لبرنامج Illustrator، و<a href="https://academy.hsoub.com/design/3d/blender/" rel="">برنامج بلندر Blender</a> البديل لبرنامج التصميم ثلاثي الأبعاد 3ds Max، والذي <span ipsnoautolink="true">تستخدمه كل من وكالة ناسا ووكالة إيسا للفضاء في تصميم محاكاة واقعية للثقوب السوداء مثلًا، وكذلك شركة BMW في تصميم منتجاتها</span>، وقس عليها في البرامج الهندسية وبرامج التصميم والفيديو وغيرها.
</p>

<p>
	توجد بعض المواقع المفيدة لمعرفة البرامج البديلة المتاحة لتطبيق معين تستخدمه، مثل موقع <a href="https://www.opensourcealternative.to/" rel="external nofollow">opensourcealternative</a> أو <a href="https://alternativeto.net/" rel="external nofollow">alternativeto</a> حيث تكتب فيها اسم التطبيق الذي تستخدمه فيرشح لك البدائل المتاحة لأنظمة لينكس، والتي تكون غالبًا مفتوحة المصدر ومجانية معًا.
</p>

<h2 id="-">
	أمثلة التوزيعات المتاحة
</h2>

<p>
	توجد مئات التوزيعات المتاحة للاستخدام من لينكس، أغلبها للاستخدام العام الذي يصلح لأغلب المهام اليومية للمستخدمين من تصفح الويب ومشاهدة المحتوى والعمل، لكنها جميعًا تنحدر من خمس أو ست توزيعات رئيسية، وسنذكر هنا ثلاثة أمثلة لأشهر تلك التوزيعات التي لها مجتمع نشط حولها لكي ترجع إليه إن واجهتك مشكلة في النظام، وهي توزيعات فيدورا وأوبنتو وأوبن سوزا.
</p>

<p>
	توفر كل توزيعة منها عدة خيارات للتحميل، كل منها تناسب شريحة استخدام بعينها، فواحدة للاستخدام العام مثلًا، وأخرى للخوادم، وثالثة موجهة لمحبي الألعاب أو بيئة المدارس التعليمية أو المختبرات أو لمهندسي الصوتيات والمونتاج وغيرها، والأمثلة التي سنذكرها أدناه هنا للنسخة العامة، ولا فرق بينها وبين بقية النسخ إلا في البرامج التي تأتي مع النظام افتراضيًا دون أن تحتاج إلى تثبيتها يدويًا.
</p>

<h3 id="-">
	توزيعة فيدورا
</h3>

<p style="text-align: left;">
	توفر <a href="https://fedoraproject.org/ar/" rel="external nofollow">توزيعة فيدورا</a> Fedora Linux عدة إصدارات للتحميل مباشرة موجهة للاستخدامات المختلفة، لكن سنركز على إصدارين فقط هما جنوم Gnome وكِدي بلازما KDE Plasma، وهما بيئتا سطح مكتب أو واجهات مرئية لسطح المكتب، هذا ما تتعامل معه كل يوم من قوائم وأزرار وأيقونات وغيرها، وتشبه <a href="https://fedoraproject.org/ar/workstation/" rel="external nofollow">بيئة جنوم</a> الواجهة المرئية لنظام ماك. انظر الصورة التالية من بيئة جنوم لتوزيعة فيدورا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181587" href="https://academy.hsoub.com/uploads/monthly_2026_03/fedora_gnome.png.b8c97ba79a84d9e25f6d303fc9c6e123.png" rel=""><img alt="fedora_gnome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181587" data-ratio="56.33" data-unique="m3m218q49" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/fedora_gnome.thumb.png.fc4b0d169fc3e77a70862d0ea2901951.png"></a>
</p>

<p>
	والصورة التالية من بيئة كِدي بلازما، وهي أشبه بنظام ويندوز في الاستخدام ومناسبة أكثر لمن تعود عليه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181588" href="https://academy.hsoub.com/uploads/monthly_2026_03/fedora_KDE.png.620798654211f97928de5de9230f7e5b.png" rel=""><img alt="fedora_KDE.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181588" data-ratio="56.33" data-unique="td88tq4b0" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/fedora_KDE.thumb.png.14006907f9ec5fb2defe349ed99b9b72.png"></a>
</p>

<p>
	تُبنى هذه التوزيعة على توزيعة أم لها تسمى ريدهات RedHat Linux، وهي موجهة إلى بيئة الشركات والخوادم أكثر ولها دعم مدفوع طويل الأمد، أما فيدورا نفسها فمجانية ولا تحتاج إلى اشتراك أو ترخيص أو غيره لاستخدامها، وتحديثاتها مجانية كذلك.
</p>

<p>
	يصدر الإصدار الجديد من فيدورا كل ستة أشهر، ويكون في أبريل وأكتوبر من كل عام، ويستمر دعم كل إصدار لمدة 13 شهر بعده، هذا غير التحديثات المستمرة التي تكون في كل أسبوع تقريبًا.
</p>

<h3 id="-">
	توزيعة أوبنتو
</h3>

<p>
	بالمثل هنا فإن <a href="https://ubuntu.com/download" rel="external nofollow">توزيعة أوبنتو</a> مبنية على توزيعة أخرى هي ديبيان Debian، وهي توزيعة حرة مجانية وموجهة كذلك إلى الاستخدام العام، ومنها عدة إصدارات مخصصة كما في فيدورا للاستخدامات المختلفة أو بيئات سطح المكتب المختلفة مثل جنوم وكِدي وغيرهما. انظر المثال التالي من بيئة جنوم في إحدى توزيعات أوبنتو:
</p>

<p style="text-align: center;">
	<span id="cke_bm_1566C" style="display: none;"> </span><a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181589" href="https://academy.hsoub.com/uploads/monthly_2026_03/ubuntu_gnome.png.432c65fed4dcb701a9fc2cc666459037.png" rel=""><img alt="ubuntu_gnome.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181589" data-ratio="56.33" data-unique="fu84j4gas" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/ubuntu_gnome.thumb.png.90924a9bef7a9e36cb1751c99e3dcba8.png"></a>
</p>

<p>
	وهذا المثال من بيئة كِدي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181590" href="https://academy.hsoub.com/uploads/monthly_2026_03/kubuntu_25_10.png.d3c36bffb3083a88b281182cb3de1f2d.png" rel=""><img alt="kubuntu_25.10.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181590" data-ratio="56.22" data-unique="2yo76a588" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/kubuntu_25_10.thumb.png.51ab28ad8a2406702219d8ae45bdd352.png"></a>
</p>

<p>
	تصدر توزيعة أوبنتو الجديدة كل ستة أشهر كذلك، مرة في أبريل ومرة في أكتوبر وتحمل التوزيعة حينها اسم العام والشهر -مثال: أوبنتو 25.10 صدرت في شهر أكتوبر عام 2025-، ويستمر الدعم لمدة 9 أشهر لكل إصدار. كذلك تُصدر كل عامين إصدارًا له دعم لمدة خمس سنوات فيما تسميه الدعم طويل الأمد Long Term Support LTS، ويصدر في العادة في شهر أبريل من الأعوام ذات الأرقام الزوجية، على سبيل المثال كانت الإصدارات طويلة الدعم السابقة في أبريل 2022، وأبريل 2024، ويُتوقع أن تخرج الثالثة وقت كتابة هذا المقال في أبريل 2026.
</p>

<h3 id="-">
	توزيعة أوبن سوزا
</h3>

<p>
	تُعد توزيعة <a href="https://www.opensuse.org/" rel="external nofollow">أوبن سوزا OpenSuse</a> إحدى أقدم التوزيعات الموجودة على الساحة إذ تعود جذور الشركة التي بدأتها إلى 1992، وتعتمد طريقتين في التحديثات كما في أوبنتو، لكنها تقسمها إلى إصدارين مستقلين:
</p>

<ul>
	<li>
		<a href="https://get.opensuse.org/leap/16.0/" rel="external nofollow">إصدار Leap</a>: يخرج هذا الإصدار مرة في كل عام، ويشبه تثبيت أي نظام حيث يستطيع المستخدم تحميل نسخته وتثبيته أو ترقيته من داخل نظامه الحالي إن كان يستخدم نسخة أقدم. يستمر دعم هذا الإصدار عامين.
	</li>
	<li>
		<a href="https://get.opensuse.org/tumbleweed/?type=desktop#download" rel="external nofollow">إصدار Tumbleweed</a>: لا توجد لهذا الإصدار نسخ أو ترقيات مرحلية في وقت معين، بل تثبتها مرة واحدة وكلما خرج تحديث جديد وصل إلى حاسوبك كأي تحديث عادي، هذا الإصدار لمن يريد تثبيت النظام مرة واحدة وينساه. دعم هذا الإصدار مستمر نظريًا إلى ما لا نهاية طالما حافظت على تثبيت التحديثات بانتظام.
	</li>
</ul>

<p>
	انظر المثال التالي من بيئة كِدي في أوبن سوزا Leap:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181591" href="https://academy.hsoub.com/uploads/monthly_2026_03/opensuse_leap.png.4baf98c3fa1eabb694d7a525fc2d60c9.png" rel=""><img alt="opensuse_leap.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181591" data-ratio="52.00" data-unique="f02w1evsl" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/opensuse_leap.thumb.png.5e9ddfeaeadb990c3b0cf3d05400362a.png"></a>
</p>

<h3 id="-">
	كلمة حول بيئات سطح المكتب
</h3>

<p>
	كما نرى في الصور السابقة للتوزيعات فإن بيئتي كِدي KDE وجنوم Gnome تشبهان نظامي ماك وويندوز إلى حد كبير، لكن توجد بيئات أخرى غيرها توفرها كل توزيعة في موقعها للتثبيت والاستخدام الجاهز كما أشرنا من قبل في حالة الإصدارات المختلفة والاستخدامات المتخصصة، فالتوزيعة ما هي إلا مجموعة من البرمجيات تتكامل مع بعضها لتعطيك تجربة استخدام معينة وفقًا للهدف منها.
</p>

<p>
	وإذا جربت إحدى التوزيعات ولم تعجبك البيئة الموجودة فيها فتستطيع تثبيت واحدة أخرى على نفس النظام دون أن تغير النسخة التي لديك كما كان يحدث في ويندوز، تستطيع تخيل الأمر كأن لديك إصدارات ويندوز 10 و8 و7 وXP على نفس الحاسوب، وتختار ما تشاء منها في كل مرة تسجل الدخول!
</p>

<h4 id="-">
	النظام الحي
</h4>

<p>
	لتجنب تكديس حاسوبك بالبرامج التي تأتي بها كل بيئة افتراضيًا، تستطيع تحميل إصدار التوزيعة بالبيئة التي تريد تجربتها وحرقها على إصبع ذاكرة USB flash باستخدام برنامج مثل <a href="https://rufus.ie/en/" rel="external nofollow">Rufus</a>، والإقلاع منها كنظام حي، حيث تستطيع تجربة النظام بالكامل ببرامجه لتعتاد عليه قبل تثبيته على حاسوبك.
</p>

<h2 id="-">
	تثبيت النظام
</h2>

<p>
	يطلب برنامج التثبيت الخاص بكل توزيعة بعض الخطوات الأساسية مثل اختيار البلد واللغة ولوحة المفاتيح، واسم المستخدم وكلمة المرور ومكان تثبيت التوزيعة، ويفضل تخصيص مساحة مخصصة من القرص للنظام أو تثبيته داخل القسم المخصص لنظام ويندوز، لكن بما أننا نفترض أن الحاسوب قديم هنا فسيحل لينكس نفسه مكان القسم المخصص لويندوز.
</p>

<h3 id="-">
	انتبه إلى خطوة تقسيم القرص الصلب
</h3>

<p>
	هنا أمر ينبغي التنبيه عليه إذ يقع فيه أغلب من يثبتون النظام لأول مرة، وقد وقعت فيه بنفسي حين ثبت توزيعة أوبنتو لأول مرة في 2010، وهو اختيار مسح القرص الصلب وتثبيت لينكس دون الانتباه إلى أن هذا سيمحو كل بياناتي الموجودة على القرص الصلب، وليس نظام ويندوز فقط.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181592" href="https://academy.hsoub.com/uploads/monthly_2026_03/erase_disk.png.ee5d177f96900443d159db4dc8879626.png" rel=""><img alt="erase_disk.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181592" data-ratio="62.11" data-unique="vf4lhfz7l" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/erase_disk.thumb.png.a54351abf11ac019f5597b23e383fa52.png"></a>
</p>

<p>
	تظهر الصورة الخيار الثاني الذي يمسح البيانات الموجودة على القرص ويثبت التوزيعة عليه بدلًا منها، لا ننصح بهذا الخيار أبدًا إلا إن كنت تعلم ما تفعل، والخيار الآمن والأفضل هو أن تختار التثبيت إلى جانب النظام الموجود، والذي سيظهر إن كان لديك نظام ويندوز -في حالتنا هنا يقترح النظام مسح أوبنتو وإعادة تثبيتها لأنها مثبتة بالفعل على الحاسوب وأستخدمها-، أو اختيار التقسيم اليدوي الذي سيظهر لك الأقسام الموجودة على القرص الصلب كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="181593" href="https://academy.hsoub.com/uploads/monthly_2026_03/manual.png.534c86fe8f5b19690d6c6661dd3f8f3a.png" rel=""><img alt="manual.png" class="ipsImage ipsImage_thumbnailed" data-fileid="181593" data-ratio="53.22" data-unique="reosdg064" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2026_03/manual.thumb.png.668bd2331e22a19c629b217d545331a0.png"></a>
</p>

<p>
	والتي تستطيع منها اختيار القسم الذي تريد حذفه ثم تثبيت أوبنتو عليه، لكن هذا الخيار متقدم قليلًا وربما تحتاج الاطلاع على بعض الشرح المتقدم حوله، لكن عمومًا يفضل أن تجعل القسم الذي تثبت عليه لينكس من نوع <code>ext4</code> أو <code>btrfs</code> وهو المقابل لنظام ملفات <code>NTFS</code> في ويندوز -لاحظ الجزء البرتقالي في الشريط الموجود في الصورة أعلاه والذي يمثل القسم الخاص بنظام لينكس على هذا الحاسوب-، وأن تجعل <code>/</code> هي نقطة الضم الخاصة بذلك القسم، وهي تشير ببساطة إلى أن هذا القسم سيكون هو القسم الجذر الذي يحمل بيانات النظام -يماثل قسم <code>C</code> في نظام ويندوز-.
</p>

<h2 id="-">
	خاتمة
</h2>

<p>
	تعرفنا في هذا المقال على بعض مزايا لينكس التي تساهم في إحياء كثير من الحواسيب القديمة وإعادتها للخدمة مرة أخرى، وكذلك استعرضنا فلسفته الحرة ومفتوحة المصدر التي تحمي حقوق المستخدم وخصوصيته على خلاف بعض أنظمة التشغيل الأخرى، نرجو لك تجربة إحياء ممتعة لحواسيبك القديمة!
</p>

<p>
	تبقى نصيحة أخيرة أجلناها لأنها قد تكون غير مناسبة لجميع الحواسيب القديمة لأن هذه قد لا تصلح للحواسيب الأقدم ولأننا نفترض استخدام الحاسوب كما هو، تلك النصيحة هي زيادة حجم الرام أو تغيير القرص الصلب إلى قرص من نوع SSD إذا كان الحاسوب يدعم هذا، فكلا الأمرين يزيد سرعة الحاسوب إلى حد كبير إما بزيادة قدرته على فتح برامج أكثر في نفس الوقت في حالة الرام أو بزيادة سرعة تنفيذ المهام العادية عند تغيير القرص الصلب إلى نوع SSD.
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%85%D9%86-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A3%D8%A8%D8%B3%D8%B7-%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-r575/" rel="">كيفية تثبيت توزيعة أوبنتو من لينكس بأبسط طريقة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">ما هو نظام التشغيل لينكس؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r779/" rel="">تعرف على سطح مكتب أوبونتو 20.04</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D9%88%D8%AC%D8%AF-100-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%85%D9%86%D9%87%D8%9F-r698/" rel="">ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">852</guid><pubDate>Sat, 07 Mar 2026 08:20:00 +0000</pubDate></item><item><title>&#x623;&#x647;&#x645; &#x645;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x635;&#x62F;&#x641;&#x629; Fish</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D9%87%D9%85-%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%B5%D8%AF%D9%81%D8%A9-fish-r847/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_05/02Fish.png.0ca499582ecf8d949988ced075866e19.png" /></p>
<p>
	تُعَد صدفة Fish واحدة من أكثر أنواع الصدفات shell تميزًا رغم كونها بذات الوقت من أقل الصدفات شيوعًا، بالرغم من أنّها مناسبة للمبتدئين والمحترفين في تطوير البرمجيات الحرّة و<a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a> على حدٍ سواء.
</p>

<p>
	توفّر Fish مجموعةً من الميزات التي تجعلها خيارًا جاذبًا، انطلاقًا من تمييز الصيغة لونيًا أي تلوين التعليمات البرمجية لتمييزها بناءً على صيغتها، ووصولًا إلى الاختصارات المفضّلة لدى العديد من المستخدمين، ومرورًا بالعديد من الإضافات المبتكرة.
</p>

<p>
	لذا سنعرض بهذا المقال بعضًا من أبرز ميزات صدفة Fish.
</p>

<h2 id="1">
	1. تمييز الصيغة لونيا
</h2>

<p>
	يعدّ المبدأ <strong>من الأفضل اكتشاف الأخطاء قبل تنفيذها</strong> أساسيًا، إذ يوفًر الكثير من الوقت والجهد ويجنبنا الإحباط، فرغم دعم معظم محرّرات النصوص الحديثة لتمييز الصيغة لونيًا كميزة مُدمجة فيها، إلّا أنّ وجه التميز في Fish يتمثّل في توفيرها لهذه الميزة ضمن الصدفة نفسها، وكونها تعمل حتى مع أوامر <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-%D9%88%D8%A3%D8%A8%D8%B1%D8%B2-%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87-%D9%88%D8%B9%D9%8A%D9%88%D8%A8%D9%87-r2252/" rel="">لينكس Linux</a>.
</p>

<p>
	ستظهر الأوامر باللون الأحمر في حال كونها غير صحيحة، والأمر ذاته ينطبق على الخيارات والوسطاء التي لا تتناسب مع السياق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="172709" href="https://academy.hsoub.com/uploads/monthly_2025_05/001_____.png.ee4d3877849bd5d703de1fef45cf989a.png" rel=""><img alt="001_كيفية_تمييز_الأخطاء_باللون_الأحمر.png" class="ipsImage ipsImage_thumbnailed" data-fileid="172709" data-ratio="21.89" data-unique="de9oex8ji" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/001_____.thumb.png.4674c14bbb40a22dc68af397eba98a71.png"></a>
</p>

<h2 id="2">
	2. الاقتراحات التلقائية
</h2>

<p>
	توفّر صدفة Fish اقتراحات للأوامر أثناء كتابتنا لها، ويمكننا تطبيقها بكل سهولة باستخدام مفتاح Tab <a data-fileext="svg" data-fileid="172720" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=172720&amp;key=e9e6f7cbd2f60b5642a682545448f970" rel="">كما يتضح بهذا الشكل بنسخة SVG</a>.
</p>

<p>
	ستظهر الاقتراحات بلون باهت أثناء الكتابة لتسهيل آلية الاستفادة منها، وفي حال كان سطر الاقتراح مناسبًا بالكامل، فيمكننا الضغط على مفتاح السهم الأيمن لاستكماله تلقائيًا.
</p>

<h2 id="3">
	3. صفحة المساعدة التفاعلية لخيارات الأوامر
</h2>

<p>
	تُعدّ من المزايا الرائعة التي تُتيح إمكانية استكمال خيارات الأوامر بالاستعانة بصفحة المساعدة الخاصة بالبرنامج أو الأداة التي نستخدمها على نحوٍ تفاعليّ.
</p>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4749_24" style=""><span class="pln">fish_update_completions</span></pre>

<p>
	إذ سيُحلّل هذا الأمر محتوى صفحات المساعدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="172701" href="https://academy.hsoub.com/uploads/monthly_2025_05/003____.png.f5ad4b74b07ec16e60300d1422cfe9f1.png" rel=""><img alt="003 تحليل محتوى صفحات المساعدة" class="ipsImage ipsImage_thumbnailed" data-fileid="172701" data-unique="ea0nfg44d" src="https://academy.hsoub.com/uploads/monthly_2025_05/003____.thumb.png.f9ed5259ab92ace403bad094974557e9.png"> </a>
</p>

<p>
	وبذلك وعند كتابة أمر معين، ما علينا سوى وضع إشارة الشرِطة (-) لإضافة الخيارات ثم الضغط على مفتاح Tab، وستظهر اقتراحات <a data-fileext="svg" data-fileid="172721" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=172721&amp;key=e6d78a16ac6220a907d38b9d6b19ceba" rel="">كما هو واضح هنا</a> من صفحة المساعدة للخيارات المُتاحة للأمر مع توصيف مختصر لكل منها.
</p>

<p>
	يمكننا التمرير عبر الخيارات وقراءة وصفها ضمن أداة عرض النصوص التفاعلية pager التي تظهر، ثم اختيار المناسب منها بناءً على وظيفته.
</p>

<p>
	تُسهّل هذه الميزة العمل مقارنةً بحالة استخدام أمر من قبيل <code>command -h</code>.
</p>

<h2 id="4">
	4. استخدام الاختصارات بدلًا من الأسماء البديلة
</h2>

<p>
	تشبه الاختصارات في صدفة Fish أدوات توسيع النصوص تلقائيًا، إذ يمكننا تعيين شيفرة مُستخدمة على نحوٍ متكرّر إلى اختصار يسهل الوصول إليه.
</p>

<p>
	فعلى سبيل المثال، سنعين فيما يلي المقطع <code>sch</code> كاختصار للأمر <code>pacman -Ss</code> المُتعلّق بالبحث عن الحزم:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4749_26" style=""><span class="pln">abbr </span><span class="pun">-</span><span class="pln">a sch pacman </span><span class="pun">-</span><span class="typ">Ss</span></pre>

<p>
	وبذلك في كل مرة نكتب فيها <code>sch</code> ونضغط على مفتاح المسافة، سيتم استبداله تلقائيًا بالأمر <code>pacman -Ss</code>.
</p>

<p>
	تجدر الإشارة إلى أن هذه الاختصارات مؤقتة وتقتصر على جلسة العمل الحالية، ولجعل الاختصار دائمًا، يمكننا كتابته في ملف التهيئة Config.
</p>

<p>
	<strong>ملاحظة</strong>: يكمن الفرق بين الأسماء البديلة والاختصارات في كون الاسم البديل يعمل في الخلفية دون أن يظهر الأمر الفعلي الذي يشير إليه; أمّا الاختصار, فيُظهر الأوامر الفعلية، كما تُسجّل بشكلها الصحيح في سجل الأوامر.
</p>

<h2 id="5">
	5. مساعدة شاملة قائمة على الويب
</h2>

<p>
	يميل المستخدمون المتمرسون في لينكس إلى الاعتماد على صفحات المساعدة كمصدر للدعم حول الأوامر، في حين ينصبّ أكثر اعتماد الجيل الجديد من مستخدمي لينكس على الإنترنت للحصول على مثل هذه المعلومات.
</p>

<p>
	وفي هذا الصدد، تُقدّم صدفة Fish مزيجًا من الطريقتين من خلال ميزة المساعدة الشاملة القائمة على الويب، والمتوفّرة بسهولة على النظام حتى في حال عدم الاتصال بالإنترنت، إذ تُخزّن محليًا. وللحصول على المساعدة أثناء استخدام صدفة Fish، نكتب الأمر التالي:
</p>

<pre class="ipsCode">help
</pre>

<p>
	وسيؤدي ذلك إلى فتح صفحة المساعدة في متصفح الويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="172700" href="https://academy.hsoub.com/uploads/monthly_2025_05/006________Fish.png.9d2d6a38ca0dc527ad51218b7de20131.png" rel=""><img alt="006_صفحة_المساعدة_القائمة_على_الويب_في_صدفة_Fish.png" class="ipsImage ipsImage_thumbnailed" data-fileid="172700" data-ratio="54.78" data-unique="bw7u8chz4" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/006________Fish.thumb.png.bd3ac5c9430e95c58aa093e88cfddbf1.png"></a>
</p>

<p>
	ومنها يُمكن الرجوع إلى التوثيق الشامل بكل سهولة.
</p>

<h2 id="6">
	6. الإعدادات المعتمدة على الويب
</h2>

<p>
	توفّر Fish ميزةً أخرى تعتمد على الويب، فلتغيير لون الموجّه أو إجراء تعديلات أخرى على الإعدادات مثلًا، لسنا مُضطرين إلى تعديل ملفات الضبط يدويًا عبر واجهة أسطر الأوامر؛ إذ من الممكن استخدام الإعدادات المعتمدة على الويب.
</p>

<p>
	يمكن كتابة الأمر التالي أثناء تشغيل صدفة Fish:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4749_28" style=""><span class="pln">fish_config</span></pre>

<p>
	وسيؤدي ذلك إلى فتح صفحة الإعدادات كواجهة رسومية ضمن متصفح الويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="webp" data-fileid="172707" href="https://academy.hsoub.com/uploads/monthly_2025_05/007___Fish___.webp.51d1d7e37e0553646935162816ba6ff7.webp" rel=""><img alt="007_إعدادات_صدفة_Fish_المعتمدة_على_الويب.webp" class="ipsImage ipsImage_thumbnailed" data-fileid="172707" data-ratio="54.78" data-unique="hpw5fkide" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/007___Fish___.thumb.webp.9c669673847d2daa30e44bdeba628311.webp"></a>
</p>

<p>
	يمكننا من خلال هذه الصفحة تغيير الألوان، أو اختيار موجّه مختلف من الخيارات المُتاحة وضبط غيرها من التعديلات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="172699" href="https://academy.hsoub.com/uploads/monthly_2025_05/008___.png.9f91ac8fc10dced1203b77059e8037bb.png" rel=""><img alt="008_قائمة_خيارات_الموجّه.png" class="ipsImage ipsImage_thumbnailed" data-fileid="172699" data-ratio="58.00" data-unique="qt43vtlgv" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/008___.thumb.png.7cd8141eb5e5507e5fa3bb79bc2091ac.png"></a>
</p>

<h2 id="7cd">
	7. الانتقال التلقائي إلى المجلدات كبديل عن الأمر CD
</h2>

<p>
	لسنا بحاجة إلى كتابة الأمر cd إذا أردنا الانتقال إلى مجلد معيّن، إذ يكفي كتابة اسم المجلد، وهذا كل ما في الأمر!
</p>

<p>
	فعلى سبيل المثال، إذا كنا في المجلد Home ورغبنا بالانتقال إلى المجلد الفرعي Downloads، فيكفي أن نكتب كلمة Downloads، كما ستعرض الصدفة اقتراحات للإكمال التلقائي أثناء الكتابة.
</p>

<p>
	أمّا إذا كنا في دليل معيّن ورغبنا بالانتقال إلى فرع مختلف تمامًا، فسنحتاج إلى استخدام المسار المطلق.
</p>

<h2 id="8">
	8. تنقل أسهل بين المسارات
</h2>

<p>
	إذا كنا بحاجة للتنقّل مرارًا بين المجلدات التي زرناها مؤخرًا، فما من داعٍ لإعادة كتابة المسار أو استخدام أمر <code>cd</code>، إذ يكفي الضغط على مفتاح Alt مع السهم اليميني للانتقال إلى المسارات السابقة أو السهم اليساري <a data-fileext="svg" data-fileid="172718" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=172718&amp;key=df8daf61e1f5ef82b20baf081a0ccc75" rel="">لهذه المسارات</a>.
</p>

<p>
	وكبديل، يمكننا كتابة الأمر <code>cdh</code> والضغط على مفتاح Enter، وستظهر أداة عرض نصوص تفاعلية تتيح لنا اختيار المجلد الذي نريد العودة إليه باستخدام الرقم المقابل له.
</p>

<h2 id="9">
	9. البحث التفاعلي في السجل
</h2>

<p>
	يمكننا البحث عن أمر معيّن في سجل الأوامر على نحوٍ تفاعليّ في صدفة Fish، وللقيام بذلك نستخدم الاختصار المعروف وهو مفتاح CTRL مع حرف R.
</p>

<p>
	سيُظهر ذلك <a data-fileext="svg" data-fileid="172719" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=172719&amp;key=d945ef2c3f35539edab3cb092c4af2fc" rel="">أداة عرض النصوص التفاعلية هذه</a> تطلب إدخال نص البحث، فما علينا سوى كتابة اسم الأمر الذي نحتاجه، وستظهر النتائج مباشرةً.
</p>

<h2 id="10">
	10. المتغيرات العمومية
</h2>

<p>
	في حال تعيّين متغير على أنّه متغير عمومي في صدفة Fish، فسيبقى مُتاحًا حتى في حال إعادة تشغيل الصدفة أو حتى النظام بأكمله.
</p>

<p>
	ولإنشاء متغير عمومي، سنستخدم الأمر التاليك
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4749_12" style=""><span class="kwd">set</span><span class="pln"> </span><span class="pun">-</span><span class="pln">U my_variable </span><span class="lit">10</span></pre>

<p>
	ستُحفظ قيمة المتغير <code>my_variable</code> لتكون 10، وستبقى محفوظةً حتى بعد إعادة تشغيل النظام.
</p>

<p>
	ولا حاجة لإضافتها إلى ملف تهيئة بيئة الصدفة RC أو ملف التكوين الشخصي Profile.
</p>

<h2 id="11">
	11. الوضع الخاص
</h2>

<p>
	توفّر صدفة Fish وضعًا خاصًا، وفيه لا تُحفظ الأوامر التي نُدخلها في سجل الأوامر ولا تُخزّن على القرص.
</p>

<p>
	وللانتقال إلى الوضع الخاص، نستخدم الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4749_14" style=""><span class="pln">fish </span><span class="pun">-</span><span class="pln">P</span></pre>

<p>
	وبمجرد الانتهاء من العمل، يمكننا الخروج من الوضع الخاص بكتابة الأمر:
</p>

<pre class="ipsCode">exit
</pre>

<h2 id="">
	الخلاصة
</h2>

<p>
	لا يُعدّ ما قدمناه في هذا المقال إلّا غيضًا من فيض لاستكشافه في صدفة Fish، إذ توفّر <a href="https://fishshell.com/" rel="external nofollow">صدفة Fish</a> العديد من الميزات التي تُسهّل الاستخدام، من قبيل:
</p>

<ul>
	<li>
		تحرير الأوامر مُتعدّدة الأسطر بسهولة بالضغط على مفتاح ALT مع مفتاح ENTER
	</li>
	<li>
		التبديل بين أنماط اختصارات لوحة المفاتيح الخاصّة بمحرّريّ النصوص Emacs (الافتراضي) وVim
	</li>
	<li>
		صيغة بسيطة وواضحة لكتابة النصوص البرمجية
	</li>
</ul>

<p>
	ولاشكّ أنّه من الممكن تحقيق معظم الميزات التي ناقشناها في هذا المقال ببذل بعض الجهد الإضافي في صدفاتٍ أخرى، ولكن وجودها مفعّلة افتراضيًا في Fish يجعل الأمر مختلفًا تمامًا.
</p>

<p>
	فمن الممكن أن تساعدنا Fish على أن نكون أكثر إنتاجية وفعالية في عملنا كمطوّرين، لاسيما في حال كنا نتحكّم في بيئة التطوير الخاصّة بنا.
</p>

<p>
	ولا يُنصح عمومًا بكتابة نصوص برمجية خاصّة بصدفة Fish على نحوٍ حصريّ إذا كان من المتوقّع أن يعمل الآخرون عليها في صدفة Bash، إذ قد نواجه مشكلات في التوافق بين الصدفات في البيئات المشتركة مُتعدّدة المستخدمين.
</p>

<p>
	ننصحكم بتجربة صدفة Fish ومراقبة سير الأمور، فربما ستجعلونها صدفتكم الافتراضية!
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://itsfoss.com/fish-shell-features/" rel="external nofollow">11 Fish Shell Features That Make it More Awesome Than Bash</a> لصاحبيه Abhishek Prakash وSreenath.
</p>

<h2 id="-1">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">مدخل إلى صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/databases/postgresql/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B5%D8%AF%D9%81%D8%A9-psql-r473/" rel="">أساسيات استخدام صدفة psql</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%82%D8%B1%D8%A7%D8%A1%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-%D9%88%D8%A7%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r697/" rel="">قراءة وضبط متغيرات الصدفة Shell والبيئة في لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">847</guid><pubDate>Mon, 14 Jul 2025 16:04:04 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x62F;&#x64A;&#x62B; &#x627;&#x644;&#x62A;&#x644;&#x642;&#x627;&#x626;&#x64A; &#x644;&#x62E;&#x627;&#x62F;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB-%D8%A7%D9%84%D8%AA%D9%84%D9%82%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r840/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_03/---.png.59c09d9da58b420f83ccf9c0bed806b8.png" /></p>
<p>
	نناقش اليوم عدة طرق لتحديث خوادم أوبنتو تلقائيًا والاستفادة من ذلك في حماية الخوادم من الأخطاء والثغرات الأمنية وضمان عملها بأمان وموثوقية، وسنوضح استخدام بعض الأدوات والإعدادات التي تسهّل علينا إدارة تحديثات الخوادم وتصحيحها وإعادة تشغيلها، فإجراء تلك الأمور يدويًا أمر مرهق لمدير النظام وقد يتسبب بوقوع أخطاء.
</p>

<p>
	يشمل مقالنا ثلاثة أقسام:
</p>

<ul>
	<li>
		<a href="#1" rel="">أفضل ممارسات إدارة التطبيقات لضمان إعادة تشغيلها بشكل صحيح بعد التحديث</a>
	</li>
	<li>
		<a href="#2" rel="">إعدادات الترقية التلقائية للمكتبات والحزم العاملة على الخادم</a>
	</li>
	<li>
		<a href="#3" rel="">التحديث والتصحيح المباشر لنواة النظام</a>
	</li>
</ul>

<h2 id="-1">
	متطلبات العمل
</h2>

<p>
	نحتاج خادم يعمل بنظام التشغيل <a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r779/" rel="">أوبونتو</a>، مع مستخدم عادي غير المستخدم الجذر root لكنه يتمتع بصلاحيات عالية <code>sudo</code> لتشغيل الأوامر الإدارية عند الحاجة، ويمكن تجهيز المطلوب باتباع خطوات مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">التهيئة الأولية لخادم أوبونتو</a>.
</p>

<h2 id="1">
	أفضل ممارسات إدارة التطبيقات
</h2>

<p>
	عند ترقية الخادم، ستراودنا مخاوف أساسية تتعلق باستمرارية عمل التطبيقات بعد التحديث وإعادة التشغيل مثل كيف ستعمل تطبيقاتنا بعد ترقية الخادم؟ وهل سيعود الخادم لسلوكه الطبيعي بعد إعادة التشغيل اللاحقة للترقية؟ تشكل هذه الأسئلة هاجسًا لأي مدير النظام يسعى لتحديث خادمه وقد تجعله يتخلى عن قرار الترقية.
</p>

<p>
	كما سنحتاج للإجابة على هذه التساؤلات عند ضبط إعدادات الترقية التلقائية automatic upgrades على الخوادم ونتأكد من إعادة تشغيل جميع التطبيقات العاملة على الخادم بصورة سليمة بعد أي إعادة تشغيل أو توقف مفاجئ، علمًا أن أدوات <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">إدارة حزم لينكس</a> مصممة في الأساس لتعمل في الخلفية دون عرقلة أو أعباء صيانة إضافية على الخادم.
</p>

<p>
	نظريًّا ينبغي أن تُدار جميع التطبيقات العاملة على الخادم باستخدام نظام التمهيد init system ما أمكن ذلك، و <a href="https://academy.hsoub.com/devops/linux/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D9%85%D9%87%D9%8A%D8%AF-systemd-r284/" rel="">systemd</a> هي أداة التمهيد الرئيسية في أوبنتو وفي معظم <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B1%D8%B6-%D9%85%D9%88%D8%AC%D8%B2-%D9%84%D8%A3%D8%B4%D9%87%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r631/" rel="">توزيعات لينكس</a> الأخرى حيث تتيح التفاعل مع الخدمات العاملة على الخادم وإعادة تشغيلها تلقائيًا حسب الحاجة باستخدام الأمر <code>systemctl</code>، بناءً على ذلك فإن أي برنامج مثبت على الخادم ويعمل في الخلفية سيأتي تلقائيًا مع خدمة systemd لإدارته. بالإضافة إلى ذلك، سينشأ ملف إعدادات خاص يسمى <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-systemd-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-units%D8%8C-%D9%88%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A7%D8%AA-journal-r130/" rel="">ملف إعدادت الوحدة unit file</a> يحتوي على تعليمات تحدد كيفية تشغيل الخدمة وإيقافها وإدارتها بواسطة systemd.
</p>

<p>
	أما إذا كنا نشغل تطبيقًا خاصًا طورناه بنفسنا أو تطبيقًا ثبَّناه من <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">مستودعات Git</a> لا يتضمن ملف تمهيد للتكامل مع systemd، وسيصعب كتابة الملف يدويًّا ولن تكون نتائجه مضمونة، لذا يلجأ مدراء الأنظمة لاستخدام أدوات خاصة بإدارة التطبيقات مثل مدير العمليات <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-supervisor-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-r279/" rel="">supervisor</a> لتوفير الوقت والجهد والاستغناء عن كتابة ملفات التمهيد يدويًا، كما يمكننا أيضًا استخدام جدولة المهام بواسطة cron مع الصيغة <code>reboot@</code> لأتمتة العملية.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="400" id="ips_uid_135_6" referrerpolicy="strict-origin-when-cross-origin" src="https://academy.hsoub.com/applications/core/interface/index.html" title="جدولة المهام عبر cron" width="930" data-embed-src="https://www.youtube.com/embed/zcsGNNYkDgU"></iframe>
</p>

<p>
	ويمكن إعادة التشغيل باستخدام الأمر <code>Sudo Shutdown now -r</code> الذي يوقف جميع العمليات العاملة ويعيد تشغيل النظام مباشرةً، كما يمكننا جدولة إعادة التشغيل لتجري في وقت لاحق في ساعة ودقيقة معينة <code>hh:mm</code> بدل إعادة التشغيل الفوري، علمًا أن جميع الخدمات ونقاط الوصول endpoints الضرورية في بيئة الإنتاج ينبغي أن تعود للعمل بعد أي انقطاع طارئ.
</p>

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

<h2 id="2">
	إعدادات الترقية التلقائية
</h2>

<p>
	يبدأ مدير حزم أوبنتو <code>apt</code> عمله بتحديث حزم النظام باستخدام <code>apt update</code> ثم ترقيتها بواسطة <code>apt Upgrade</code> التي ستعمل على ترقية جميع الحزم دون استثناء لأننا لم نحدد حزمة بعينها، تستخدم صيغة الأوامر هذه في الحالة المثالية لكنها ستختلف قليلًا وتتطلب إعدادات أكثر إذا كنا نستخدم حزمًا من مستودعات طرف ثالث غير مستودعات أوبنتو ونخشى من تعارضها مع حزم <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9%D8%A7%D8%AA-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r629/" rel="">مستودعات أوبنتو</a>، أو إذا كنا نحتفظ عمدًا بإصدارات محددة من بعض الحزم ولا نود ترقيتها لأنها تتوافق مع تطبيقاتنا مثلًا.
</p>

<p>
	يوفر أوبنتو أداة فريدة لتثبيت التصحيحات الأمنية patches والترقيات الأخرى غير المُراقبة التي لا تحتاج إلى تدخل بشري لإنجازها، تسمى<code> unattended-upgrades</code> وهي مثبتة تلقائيًا في معظم خوادم أوبنتو، ويمكن تثبيتها يدويًا باستخدام أوامر <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-apt-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r785/" rel="">apt</a> التالية:
</p>

<pre class="ipsCode">$ sudo apt update
$ sudo apt install unattended-upgrades
</pre>

<p>
	يمكن التأكد من عمل الخدمة <code>unattended-upgrades</code> باستخدام <code>systemctl</code> كما يلي:
</p>

<pre class="ipsCode">$ sudo systemctl status unattended-upgrades.service
</pre>

<p>
	إذا كانت الخدمة تعمل، سنحصل على خرج يشبه التالي:
</p>

<pre class="ipsCode">unattended-upgrades.service - Unattended Upgrades Shutdown
     Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-02-14 17:51:49 UTC; 3h 4min ago
       Docs: man:unattended-upgrade(8)
   Main PID: 829 (unattended-upgr)
      Tasks: 2 (limit: 1137)
     Memory: 10.6M
     CGroup: /system.slice/unattended-upgrades.service
</pre>

<p>
	ستعمل الأداة <code>unattended-upgrades</code> بإعداداتها الافتراضية على تثبيت كافة الإصلاحات والتحديثات المتوفرة للحزم التابعة لمستودعات أوبنتو، أما إذا كنا نستخدم إصدارات أقدم من بعض الحزم وأردنا تجنب التعديلات على المستودع الأولي upstream changes أو كان خادمنا يستخدم مستودعات طرف ثالث تتبع لجهات خارجية إلى جانب مستودعات أوبنتو فسنحتاج عندها لتعديل إعدادات <code>unattended-upgrades</code> الافتراضية وضبطها بطريقة مختلفة.
</p>

<p>
	تُخَزَّن إعدادات هذه الأداة في الملف <code>‎/etc/apt/apt.conf.d/50unattended-upgrades</code> ويمكننا فتحه وتحريره بواسطة أي محرر نصوص مثل <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A%D9%85-vim-%D9%88%D9%86%D8%A7%D9%86%D9%88-nano-r1590/" rel="">نانو <code>nano</code></a> أو غيره كما يلي:
</p>

<pre class="ipsCode">$ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
</pre>

<p>
	بمجرد فتح الملف، سنلاحظ أنه سهل القراءة ومشروح جيدًا، ويتضمن مجموعة من التعليقات التي تشرح التعليمات البرمجية ووظائفها، تتضمن كتلة التعليمات الأولى في الملف أسماء الحزم التي ستُحَدِّثها الأداة تلقائيًا ولها القالب العام لأسماء مستودعات حزم أوبنتو، وهي افتراضيًا ملفات المستودع المركزي core repository وملفات مستودع الحماية <code>security-</code>، أما مستودعات <code>updates-</code> و <code>proposition-</code> و <code>backports-</code> فتحديثها مُعطّل افتراضيًا ويُترك للمستخدم حرية تفعيلها من عدمه، لأنها قد تتضمن تعديلات جذرية على حزم النظام لذا نجد أن أسطرها تبدأ برمز التعليق <code>//</code>، ويمكن إزالته إن رغبتنا بتفعيل التحديثات التلقائية لها.
</p>

<p>
	إذا تابعنا تصفح الملف، سنجد عددًا من الأسطر التي يمكن التحكم بخياراتها باستخدام <code>true</code> أو <code>false</code>، على سبيل المثال يوجد خيار خاص بتفعيل إعادة التشغيل التلقائية بعد تثبيت الحزم التي تتطلب إعادة تشغيل كي تتفعل وتدخل حيز التنفيذ، يمكن تفعيل هذا الخيار بإزالة رمز التعليق <code>//</code> وتبديل القيمة <code>false</code> إلى <code>true</code>، لكن اتخاذ قرار كهذا سيعرضنا لانقطاعات غير متوقعة في الخدمة نتيجة إعادة التشغيل وينبغي أن تكون طبيعة تطبيقاتنا قادرة على تحمل التبعات الناتجة عن ذلك.
</p>

<pre class="ipsCode">// Automatically reboot *WITHOUT CONFIRMATION* if
//  the file /var/run/reboot-required is found after the upgrade
//Unattended-Upgrade::Automatic-Reboot "false";
</pre>

<p>
	بعد الانتهاء من إجراء التعديلات، نحفظ التغييرات على الملف ونغلقه بالخطوات التي تناسب محرر النصوص المستخدم ففي <code>nano</code> مثلًا نضغط على <code>Ctrl+X</code> ثم <code>Y</code> وبعدها <code>Enter</code>.
</p>

<p>
	والآن نعيد تشغيل الخدمة <code>unattended-upgrades</code> وفق الأمر التالي لتصبح التعديلات سارية المفعول:
</p>

<pre class="ipsCode">$ sudo systemctl restart unattended-upgrades.service
</pre>

<p>
	بهذا نكون قد انتهينا من شرح طريقة ضبط التحديثات الأمنية التلقائية لحزم النظام لتعمل تلقائيًا دون تدخل منا، سنناقش في الفقرة التالية تحديث نواة النظام والتعامل مع الحالات التي تقتضي إعادة التشغيل.
</p>

<h2 id="3">
	التحديث والتصحيح المباشر لنواة النظام
</h2>

<p>
	نواة <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-%D9%88%D8%A3%D8%A8%D8%B1%D8%B2-%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87-%D9%88%D8%B9%D9%8A%D9%88%D8%A8%D9%87-r2252/" rel="">نظام لينكس</a> هي الجزء الأساسي من المظام حيث تحتوي على تعريفات معظم الأجهزة كالمعالج والذاكرة والطابعة وغيرها، وهي المسؤولة عن التفاعل منخفض المستوى بين العتاد الصلب والبرامج، وتصدر تحديثاتها بتواتر أقل من تحديثات الحزم الأخرى، وعادةً ما ترتبط بظهور ثغرة أمنية خطيرة ينبغي معالجتها، أو ظهور ميزة جديدة، وقد تكون ضرورية أيضًا في الحالات التي تصبح فيها النواة قديمة جدًا لدرجة نخشى معها وجود ثغرات أمنية وأخطاء متراكمة لا علم لنا بها.
</p>

<p>
	لا توجد منهجية جاهزة لجدولة تحديثات نواة نظام لينكس بصورة تلقائية فهذا الأمر يختلف من حالة لأخرى، فتحديثات النواة تتطلب إعادة تشغيل كاملة للنظام، ومنطقيًا لا يمكن جدولة أمر كهذا دون أخذ بيئة التشغيل الخاصة بكل خادم والخدمات التي يقدمها بالحسبان، فبعض <a href="https://academy.hsoub.com/devops/servers/" rel="">الخوادم</a> ينبغي أن تعمل على مدار اليوم والساعة دون انقطاع، وبعضها قد يأخذ وقتًا طويلًا لا يمكن التكهن به في إعادة التشغيل، أو قد يتطلب تدخلًا يدويًا لإتمام العملية أو غير ذلك، لذا لا يمكن جدولة التحديث ليجري تلقائيًا دون علم المستخدم وموافقته.
</p>

<p>
	أما إذا كنا لا نمانع بإجرائها تلقائيًا مع ما يترتب عليها من فترات انقطاع في الخدمة، فيمكننا ضبط ذلك في إعدادات التحديثات غير المُراقبة unattended updates بواسطة <code>apt</code> ليجري تحديث نواة النظام وتثبيت إصدارتها الجديدة مع بقية الحزم، وسيستخدم خادمنا النواة الجديدة المُحَدَّثة تلقائيًا بعد إعادة التشغيل، لكن عادةً ما يلجأ مديرو النظام في بيئات التشغيل الحقيقية لأساليب تضمن استمرارية تقديم الخدمة للعملاء مثل استخدام <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-haproxy-%D9%88%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D9%85%D9%88%D8%A7%D8%B2%D9%86%D8%A9-%D8%A7%D9%84%D8%AD%D9%85%D9%84-load-balancing-r41/" rel="">موازن حمل</a> يوجه حركة مرور البيانات إلى الخوادم البديلة أثناء إعادة تشغيل الخادم الذي يُحَدِّث نواته، وتكرار العملية مع بقية الخوادم بالترتيب ليكتمل تحديث المجموعة كلها دون أن يشعر المستخدم بالانقطاع.
</p>

<h3 id="livepatch">
	تفعيل التصحيح المباشر Livepatch لإبقاء الخادم يعمل عند تحديث النواة
</h3>

<p>
	يوفر نظام <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a> ميزة مفيدة تدعى التصحيح المباشر live patching تسمح لنا بتحديث النواة kernel دون إعادة التشغيل، ويُشرف على التصحيحات المباشرة -وفق هذه الميزة- أداتان أساسيتان هما:
</p>

<ul>
	<li>
		Canonical الخاصة بأنظمة أوبنتو حصرًا
	</li>
	<li>
		KernelCare التي تدعم معظم توزيعات لينكس الشهيرة إلى جانب أوبنتو
	</li>
</ul>

<p>
	علمًا أننا نحتاج لتسجيل حساب على موقع كلتا الأداتين لاستخدامهما، وتوفر Canonical إمكانية التسجيل والاستخدام المجاني للأفراد.
</p>

<p>
	يمكن تسجيل الدخول إلى Canonical والحصول على مفتاح خاص بالتصحيح المباشرة من <a href="https://auth.livepatch.canonical.com/" rel="external nofollow">هذا الرابط</a>، ويمكننا بعدها تثبيت الحزمة <code>canonical-livepatch</code> بواسطة <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B3%D8%AD-%D8%AD%D8%B2%D9%85-snap-%D8%A7%D9%84%D9%85%D8%B9%D8%B7%D9%84%D8%A9-%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r623/" rel=""><code>snap</code></a> -وهو مدير حزم آخر يعمل إلى جانب <code>apt</code> في أنظمة أوبنتو- كما يلي:
</p>

<pre class="ipsCode">$ sudo snap install canonical-livepatch
</pre>

<p>
	ثم نكتب الأمر التالي لتفعيل الحزمة <code>canonical-livepatch</code>، ولا ننسى استبدال <code>your-key</code> بمفتاحنا الخاص الذي حصلنا عليه من موقع Canonical:
</p>

<pre class="ipsCode">$ sudo canonical-livepatch enable your-key
</pre>

<p>
	بعد التنفيذ ستظهر رسالة واضحة تعلمنا بنجاح تثبيت الخدمة <code>Successfully enabled device</code> وبذلك ستصبح <code>canonical-livepatch</code> خدمة عاملة على نظامنا، وستعمل في الخلفية ويمكن التأكد من ذلك بالاستعلام عن حالتها بواسطة <code>canonical-livepatch status</code> كما يلي:
</p>

<pre class="ipsCode">$ sudo canonical-livepatch status
</pre>

<p>
	سنحصل على خرج يشبه التالي:
</p>

<pre class="ipsCode">last check: 50 seconds ago
kernel: 5.15.0-25-generic
server check-in: succeeded
patch state: ✓ all applicable livepatch modules inserted
patch version: 84.1
tier: updates (Free usage; This machine beta tests new patches.)
machine id: 2565a9e7fc9f4405a167e4caf9b9dcf3
</pre>

<p>
	بمساعدة هذه الأداة نكون قد ضبطنا التحديثات التلقائية لنواة نظامنا كي تحدث من دون تدخل يدوي، ودون الحاجة لإعادة تشغيل النظام لنحافظ بذلك على بيئة تشغيل آمنة ومُحَدَّثة لتطبيقاتنا.
</p>

<h2 id="-2">
	الخلاصة
</h2>

<p>
	تعرفنا في هذا المقال على جانب أساسي من مهام <a href="https://academy.hsoub.com/devops/general/%D8%AA%D8%B9%D9%84%D9%85-devops/" rel="">مهندسي DevOps</a> وهو تحديث الخوادم والتعامل مع التحديثات التي تتطلب إعادة تشغيل، وتعلمنا الفرق بين تحديث حزم أوبنتو وتحديث نواة النظام، ويمكن التعمق أكثر في إدارة أوبنتو ومهام DevOps  الأخرى بتحميل كتاب <a href="https://academy.hsoub.com/files/10-%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88/" rel="">دليل إدارة خوادم أوبنتو</a> مجانًا من أكاديمية حسوب، ومطالعة مقالات <a href="https://academy.hsoub.com/devops/" rel="">قسم DevOps</a> أيضًا على الأكاديمية.
</p>

<p>
	ترجمة -وبتصرف- لمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-keep-ubuntu-22-04-servers-updated" rel="external nofollow">How to Keep Ubuntu 22.04 Servers Updated</a> لصاحبه Alex Garnett.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D9%86%D9%82%D9%91%D9%84-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r24/" rel="">أساسيات إدارة الملفّات والتنقّل في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-apt-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r785/" rel="">الدليل الكامل لاستخدام أوامر apt في نظام لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-r576/" rel="">تثبيت لينكس مع نظام ويندوز</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r634/" rel="">كيفية تثبيت التطبيقات في لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">840</guid><pubDate>Sat, 22 Mar 2025 12:04:01 +0000</pubDate></item><item><title>&#x623;&#x62A;&#x645;&#x62A;&#x629; &#x627;&#x644;&#x645;&#x647;&#x627;&#x645; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D8%B4-bash-r833/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/----Bash.jpg.050957f5836f6eba796ab75228e28475.jpg" /></p>
<p>
	تُعدّ أتمتة المهام المتكررة هدفًا ضمنيًا لكل مستخدم يتعلم أساسيات باش، فهي في الغالب الغاية الأساسية من كل سكربت نكتبه، وسنعرض في هذا المقال مجموعة سكربتات مفيدة يمكنك الاستناد عليها لتتعلم أتمتة أي مهمة تريدها على خوادم لينكس، سنستخدم هنا جميع المهارات التي تعلمناها خلال السلسلة بدايةً من <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/" rel="">المصفوفات</a> و<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/" rel="">الجمل الشرطية</a> وكذلك <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r831/" rel="">الحلقات</a> والمفاهيم الأخرى.
</p>

<h2 id="">
	إنشاء سكربت باش لإدارة المستخدمين
</h2>

<p>
	تُعدّ عملية إنشاء مستخدم على خوادم متعددة مهمة تقليدية لأي مدير نظام، لكنها مع التكرار تصبح مملة وشاقة، سننشئ معًا سكربت باش يؤتمت هذه العملية ويُنشئ المستخدمين تلقائيًا.
</p>

<p>
	سنُجهّز في البداية ملفًا نصيًّا يتضمن الأسماء hostnames أو عناوين IP للخوادم المطلوب إنشاء المستخدم عليها.
</p>

<p>
	يبين الملف servers.txt التالي على سبيل المثال أسماء خمسة خوادم:
</p>

<pre class="ipsCode">kabary@handbook:~$ cat servers.txt
server1
server2
server3
server4
server5
</pre>

<p>
	لقد استخدمنا أسماء الخوادم هنا بدلًا من عناوين IP الخاصة بها لأن هذه العناوين مخزنة لدينا في الملف "etc/hosts/" الذي يتضمن الاسم hostname وعنوان IP المقابل له، وتستطيع أيضًا استخدام <a href="https://academy.hsoub.com/devops/security/ssh/%D8%AF%D9%84%D9%8A%D9%84-%D8%A8%D8%B5%D8%B1%D9%8A-%D9%84%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D9%86%D9%81%D8%A7%D9%82-ssh-r508/" rel="">ملف إعدادات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></a>.
</p>

<p>
	والآن لنفحص سكربت إنشاء المستخدمين adduser.sh التالي:
</p>

<pre class="ipsCode">#!/bin/bash

servers=$(cat servers.txt)

echo -n "Enter the username: "
read name
echo -n "Enter the user id: "
read uid

for i in $servers; do
echo $i
ssh $i "sudo useradd -m -u $uid $name"
if [ $? -eq 0 ]; then
echo "User $name added on $i"
else
echo "Error on $i"
fi
done
</pre>

<p>
	عند تنفيذ السكربت سيطلب منا إدخال اسم المستخدم والمُعرِّف الخاص به، ثم سيتصل السكربت بكل خادم من الخوادم المحددة في الملف servers.txt السابق عبر اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> ويُنشئ عليه المستخدم الذي طلبناه.
</p>

<p>
	ننصح بمطالعة المزيد عن تقنية <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> للاتصال بالخوادم البعيدة عبر مشاهدة الفيديو التالي:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="487" id="ips_uid_512_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هي تقنية SSH" width="866" data-embed-src="https://www.youtube.com/embed/CGDYjTTDOYg"></iframe>
</p>

<p>
	لنلاحظ الآن طريقة عمل السكربت بعد التنفيذ:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165330" href="https://academy.hsoub.com/uploads/monthly_2025_01/img01-bash-script-adduser.png.5c5d22212ab4dd5163e5715ab4e44a99.png" rel=""><img alt="img01-bash-script-adduser.png" class="ipsImage ipsImage_thumbnailed" data-fileid="165330" data-ratio="79.00" data-unique="gzcarrfwq" style="width: 400px; height: auto;" width="759" src="https://academy.hsoub.com/uploads/monthly_2025_01/img01-bash-script-adduser.thumb.png.873f90984939bfef1fa13b3e3d46b229.png"></a>
</p>

<p>
	بهذا نكون قد نجحنا في إنشاء مستخدم يدعى ansible على الخوادم الخمسة المطلوبة.
</p>

<p>
	يوجد نقطتان مهمتان للغاية يتوجب علينا فهمها عند التعامل مع سكربت من هذا النوع:
</p>

<ul>
	<li>
		ضرورة استخدم مفاتيح مرور pass phrases فارغة لجلسات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></abbr>، أو استخدم الوكيل <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></abbr>-agent لتمرير هويتنا إلى الخادم البعيد حتى لا نضطر لإدخال كلمة المرور في أثناء عمل السكربت
	</li>
	<li>
		الحرص على امتلاك حساب مستخدم فعال وعالي الصلاحيات يتمتع بأذونات الوصول إلى جميع الخوادم المطلوبة بدون متطلبات تتعلق بكلمة المرور
	</li>
</ul>

<p>
	تخيل أنك تحتاج لتعرف مستخدمين جدد على مائة خادم مثلًا، فكم ستكون العملية طويلة وشاقة، هنا تكمن أهمية الأتمتة إذ توفر عليك ساعات من العمل المضني.
</p>

<h2 id="-1">
	أتمتة عمليات النسخ الاحتياطي
</h2>

<p>
	النسخ الاحتياطي مهمة أساسية لا غنى عنها في كل منظومة، وكثيرًا ما نستخدم سكربتات باش لأتمتة المهام، يبين السكربت backup.sh التالي مثالًا عليها:
</p>

<pre class="ipsCode">#!/bin/bash

backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)

echo "Starting backup of: ${backup_dirs[@]}"

for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done

sudo rm /tmp/*.gzecho "Backup is done."
</pre>

<p>
	لنشرح السكربت أعلاه: أنشأنا في البداية مصفوفة تدعى backup_dirs سنكتب فيها أسماء المجلدات التي نريد أخذ نسخ احتياطية عنها، ثم عرّفنا ثلاثة متغيرات:
</p>

<ul>
	<li>
		<code>dest_dir</code>: لتحديد مجلد الوجهة الذي ستُحفظ فيه النسخ الاحتياطية
	</li>
	<li>
		<code>dest_server</code>: لتعيين الخادم الهدف
	</li>
	<li>
		<code>backup_time</code>: لتحديد تاريخ بدء عملية النسخ الاحتياطي
	</li>
</ul>

<p>
	وبعدها أنشأنا حلقة for ستمر على المجلدات الموجودة في المصفوفة "backup_dirs" واحدًا واحدًا و<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A3%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r243/" rel="">تضغط كل مجلد منها باستخدام التعليمة <code>tar</code></a> وتحتفظ بالنسخة المضغوطة في المجلد المؤقت <code>tmp/</code>، ثم <a href="https://academy.hsoub.com/devops/networking/%D9%85%D8%A7-%D9%87%D9%88-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-%D8%A7%D9%84%D8%A2%D9%85%D9%86-scp%D8%9F-r617/" rel="">تنسخها إلى الخادم الهدف بواسطة التعليمة <code>scp</code></a>، وبعد اكتمال النسخ ستُحذف الملفات المضغوطة من المجلد <code>tmp/</code>.
</p>

<p>
	يبين الخرج التالي أمثلة على طريقة عمل السكربت:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./backup.sh
Starting backup of: /etc /home /boot
/etc backup succeeded.
etc-Aug-30-20.tar.gz 100% 1288KB 460.1KB/s   00:02
/etc transfer succeeded.
/home backup succeeded.
home-Aug-30-20.tar.gz 100% 2543KB 547.0KB/s   00:04
/home transfer succeeded.
/boot backup succeeded.
boot-Aug-30-20.tar.gz 100%  105MB 520.2KB/s   03:26
/boot transfer succeeded.
Backup is done.
</pre>

<p>
	يمكننا جدولة السكربت باستخدام مهام cron job لتبدأ أعمال النسخ الاحتياطي عند منتصف الليل مثلًا، وذلك وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~$ crontab -e
0    0   *   *   * /home/kabary/scripts/backup.sh
</pre>

<p>
	يمكن معرفة المزيد عن جدولة المهام بواسطة cron بالاطلاع على الفيديو التالي على قناة أكاديمية حسوب:
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="487" id="ips_uid_512_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هي تقنية cron لجدولة المهام" width="866" data-embed-src="https://www.youtube.com/embed/uLnPBHU_lw4"></iframe>
</p>

<h2 id="-2">
	مراقبة المساحات التخزينية المتوفرة على القرص الصلب
</h2>

<p>
	المساحات التخزينية على <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%81%D9%87%D9%85-%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%86%D9%83%D8%B3-r53/" rel="">نظام الملفات</a> في تناقص دائم وهذا أمرٌ مفروغٌ منه، وكل ما نستطيع القيام به تجاه هذا الأمر هو المراقبة والتصرف بالوقت المناسب حتى يؤدي التناقص المستمر إلى نفاذ المساحة وتعطل النظام، يساعدنا الأمر <code>df</code> على عرض المساحات المتوفرة على أي نظام ملفات، وهذا مثال على استخدامه:
</p>

<pre class="ipsCode">kabary@handbook:~$ df -h / /apps /database
Filesystem Size  Used Avail Use% Mounted on
/dev/sda5 20G  7.9G   11G  44% /
/dev/mapper/vg1-applv 4.9G  2.4G  2.3G  52% /apps
/dev/mapper/vg1-dblv 4.9G  4.5G  180M  97% /database
</pre>

<p>
	كما نلاحظ هنا فالمساحة المخصصة لقاعدة البيانات <code>database/</code> على نظام الملفات هذا تكاد تنفذ فنسبة استخدامها 97%، يمكنك عرض نسبة الاستخدام فقط بدون التفاصيل الأخرى بواسطة الأمر <code>awk</code>.
</p>

<p>
	دعونا لنستعمل الآن هذين الأمرين في السكربت disk_space.sh كما يلي:
</p>

<pre class="ipsCode">#!/bin/bash
filesystems=("/" "/apps" "/database")
for i in ${filesystems[@]}; do
usage=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $usage -ge 90 ]; then
alert="Running out of space on $i, Usage is: $usage%"
echo "Sending out a disk space alert email."
echo $alert | mail -s "$i is $usage% full" your_email
fi
done
</pre>

<p>
	يبدأ السكربت بإنشاء مصفوفة تدعى filesystems نكتب فيها أسماء مسارات أنظمة الملفات التي نود مراقبتها، ويوجد بعدها حلقة تكرار تُنَفذ عند كل عنصر من عناصر المصفوفة، وتستعلم عن نسبة استخدام المساحة التخزينية المخصصة له فإذا كانت أكبر من 90% سيُرسل لنا السكربت تنبيهًا عبر البريد الإلكتروني يخبرنا بأن المساحة على وشك النفاذ.
</p>

<p>
	ملاحظة: لاستخدام السكربت السابق يتوجب استبدال <code>your_email</code> بعنوان بريد إلكتروني حقيقي.
</p>

<p>
	سنحصل على هذا الخرج بعد تنفيذ السكربت:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./disk_space.sh
Sending out a disk space alert email.
</pre>

<p>
	وستكون رسالة البريد الإلكتروني مشابهة للتالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="165328" href="https://academy.hsoub.com/uploads/monthly_2025_01/img02-send-email-bash-sript.png.4672ada3fe627b72e95c18a659ae912a.png" rel=""><img alt="img02 send email bash sript" class="ipsImage ipsImage_thumbnailed" data-fileid="165328" data-ratio="71.33" data-unique="1v9dtxk5o" style="width: 400px; height: auto;" width="300" src="https://academy.hsoub.com/uploads/monthly_2025_01/img02-send-email-bash-sript.png.4672ada3fe627b72e95c18a659ae912a.png"> </a>
</p>

<p>
	لنفترض الآن أننا نرغب بجدولة السكربت disk_space.sh ليعمل كل ست ساعات مرة باستخدام مهام cron، فسنكتب التالي:
</p>

<pre class="ipsCode">kabary@handbook:~$ crontab -e
0    */6 *       *       * /home/kabary/scripts/disk_space.sh
</pre>

<h2>
	الخاتمة
</h2>

<p>
	وصلنا لنهاية مقالنا الذي عرضنا لكم فيه أمثلة بسيطة توضح أتمتة المهام بواسطة سكربتات باش، إن الإمكانات الفعلية لباش أكبر بكثير، لذا ندعوكم لتجربة تطوير السكربتات الموجودة هنا وتنفيذ أفكار أخرى مختلفة لتقوية مهاراتكم في باش واكتساب القدرة على أتمتة أي عمل تحتاجه على خوادم لينكس، كانت هذه نصيحتنا في ختام سلسلتنا التعليمية عن باش، نذكرك أخيرًا برابط <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">سلسلة تعلم البرمجة باستخدام باش</a><span style="display: none;">    </span>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-automation/" rel="external nofollow">Automation With Bash</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r832/" rel="">استخدام الدوال في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/" rel="">استخدام المعاملات الحسابية في سكربتات باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/" rel="">عمليات السلاسل النصية في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/" rel="">الجمل الشرطية في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r831/" rel="">الحلقات في باش </a><span style="display: none;"> </span><a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r832/" rel="">Bash</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">833</guid><pubDate>Sat, 25 Jan 2025 15:04:01 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x641;&#x64A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r832/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/----Bash.jpg.9b518f5aa9b6bb37cf92e2d38e3fbcbf.jpg" /></p>
<p>
	تساعد  <span ipsnoautolink="true">الدوال البرمجية </span>على تنظيم سكربتات باش وجعلها أسهل في القراءة، وخاصة السكربتات كبيرة الحجم، إذ يمكننا استدعاء الدالة لأداء المهمة نفسها في عدة مواضع داخل السكربت دون الحاجة لتكرار كتابة التعليمات البرمجية الخاصة بهذه المهمة أكثر من مرة.
</p>

<p>
	سنتعلم في هذا المقال كيفية إنشاء <a href="https://academy.hsoub.com/programming/python/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1906/#:~:text=%D8%AA%D9%8F%D8%B9%D9%8E%D8%AF%D9%91%20%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84%20Functions%20%D9%81%D9%8A%20%D9%84%D8%BA%D8%A7%D8%AA,%D9%83%D8%AA%D8%A7%D8%A8%D8%A9%20%D8%AF%D9%88%D8%A7%D9%84%20%D9%85%D8%AE%D8%B5%D8%B5%D8%A9%20%D9%81%D9%8A%20%D9%84%D8%BA%D8%A9" rel="">الدوال البرمجية Functions</a> في سكربتات باش وتمرير الوسطاء إليها وإرجاع النتائج منها، كما سنتعرف على الفرق بين المتغيرات المحلية والمتغيرات العامة، وعلى ماهية الدوال العودية Recursive Functions وكيفية تحقيقها في باش.
</p>

<h2 id="">
	إنشاء الدوال في باش
</h2>

<p>
	توجد صيغتان للتصريح عن <a href="https://wiki.hsoub.com/Bash/introduction_to_functions" rel="external">الدوال البرمجية في باش</a>، وتُعدّ الصيغة التالية هي الأكثر استخدامًا:
</p>

<pre class="ipsCode">function_name () {
commands
}
</pre>

<p>
	أما الصيغة الثانية الأقل شهرة، فهي تبدأ بالكلمة المفتاحية <code>function</code> يليها اسم الدالة كما يلي:
</p>

<pre class="ipsCode">function function_name {
commands
}
</pre>

<p>
	ينبغي الانتباه إلى الأساسيات التالية عن التعامل مع الدوال:
</p>

<ul>
	<li>
		لا تعمل الدالة أبدًا ما لم نقم باستدعائها
	</li>
	<li>
		لا يمكننا استدعاء الدالة قبل تعريفها، لذا نجد أن تعريف الدالة في تسلسل تعليمات السكربت يأتي قبل أي استدعاء لها
	</li>
	<li>
		نستدعي الدالة بكتابة اسمها فقط
	</li>
	<li>
		نمرر الوسيط إن وجد مباشرة بعد اسم الدالة
	</li>
</ul>

<p>
	لنلقِ نظرة على السكربت fun.sh التالي:
</p>

<pre class="ipsCode">#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello
</pre>

<p>
	عرّفنا في بداية السكربت دالة تدعى <code>hello</code> وظيفتها عرض العبارة Hello World على <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية Terminal</a>، ثم استدعينا الدالة ثلاث مرات بكتابة اسمها، لذا عند تنفيذ السكربت ستظهر العبارة Hello World على الشاشة ثلاث مرات كالتالي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./fun.sh
Hello World
Hello World
Hello World
</pre>

<h2 id="-1">
	إرجاع القيم من الدالة في باش
</h2>

<p>
	لا تُرجع لنا دوال باش قيمًا عند استدعائها على عكس السائد في معظم <a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9/" rel="">لغات البرمجة</a>، فعند انتهاء التنفيذ الدالة تُرجع حالة الخروج من آخر أمر مُنفذ وتُخَزَّن الحالة في <a href="https://wiki.hsoub.com/Bash/variables" rel="external">المتغير الخاص ‎‏‎‏‏‎‏?$</a>، فإذا كان التنفيذ ناجحًا سيأخذ المتغير <code>‎‏‏‎‏?$</code> القيمة صفر، وإذا فشل التنفيذه فسيأخذ قيمة عدد صحيح موجب آخر يقع ضمن المجال [1-255] حسب سبب الفشل.
</p>

<p>
	لكن يمكننا استخدام التعليمة <code>return</code> لتغيير حالة الخروج من الدالة كما يوضح السكربت error.sh التالي:
</p>

<pre class="ipsCode">#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"
</pre>

<p>
	إذا شغلنا السكربت السابق سنحصل على الخرج التالي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0
</pre>

<p>
	الكلمة <code>blabla</code> التي كتبناها في جسم الدالة <code>() error</code> ما هي إلّا كلمة عشوائية لا تمثل أي أمر برمجي، لذا فالتعليمية <code>return 0</code> هي السبب في حصولنا على حالة خروج صفرية من الدالة <code>() error</code> أي حالة خروج ناجحة، وبدونها ما كانت الدالة ستعطينا هذه النتيجة لأن <code>blabla</code> حتمًا سترجع رسالة خطأ مفادها لم يتم العثور على الأمر.
</p>

<p>
	رغم أن دوال باش لا تعيد قيمًا، فقد ساعدتنا طريقة الكتابة السابقة على تغيير حالة الخروج من الدالة ونجاح عملية تنفيذها، وبدونها لن تتمكن الدالة من إرجاع قيمة للبرنامج المستدعي أي لن نحصل على نتيجة تنفيذ الدالة لأن أي رمز خروج غير الصفر يشير إلى وجود خطأ.
</p>

<p>
	<strong>ملاحظة</strong>: لنتذكر دائمًا أن <code>return</code> تعني إنهاء تنفيذ الدالة والخروج منها.
</p>

<h2 id="-2">
	تمرير الوسطاء إلى دالة باش
</h2>

<p>
	يشبه تمرير الوسطاء إلى دوال باش كثيرًا تمرير الوسطاء إلى سكربتات باش، فكل ما يتطلبه الأمر كتابة الوسطاء أو سردها إلى جانب اسم الدالة عند استدعائها.
</p>

<p>
	يوضح السكربت iseven.sh التالي طريقة القيام بذلك:
</p>

<pre class="ipsCode">#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111
</pre>

<p>
	تُميّز الدالة <code>() iseven</code> في الكود أعلاه بين الأعداد الزوجية والأعداد الفردية، وقد استدعيناها أربع مرات في السكربت وفي كل استدعاء مررنا لها عددًا مختلفًا، وطالما أننا كتبنا الوسيط مباشرة بعد الدالة فهو الوسيط الأول وسيُشير له المتغير <code>$1</code>.
</p>

<p>
	لنختبر الآن طريقة عمل السكربت:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.
</pre>

<p>
	وسطاء الدالة مغايرين لوسطاء السكربت، وكل منهم يعمل في مستوى خاص مختلف عن الآخر، سيبين السكربت التالي funarg.sh الفرق:
</p>

<pre class="ipsCode">#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7
</pre>

<p>
	والآن لنشغل السكربت مع تمرير وسيطين له، ونلاحظ النتيجة:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()
</pre>

<p>
	لقد استخدمنا المتغيرين <code>$1</code> و <code>$2</code> لوظيفتين، للتعبير عن الوسيطين الأول والثاني مرة للدالة ومرة للسكربت، وعند استدعائهما من داخل الدالة كان لهما معنى مختلف عن وسطاء السكربت.
</p>

<h2 id="-3">
	المتغيرات المحلية والمتغيرات العامة داخل سكربتات باش
</h2>

<p>
	تكون <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">متغيرات باش</a> عامة Global Variables أو محلية Local Variables، يمكننا استخدام المتغيرات العامة على مستوى السكربت كاملًا، أما المتغيرات المحلية فلا تستخدم إلّا ضمن نطاق الدالة.
</p>

<p>
	يوضح السكربت domain.sh bash التالي الفرق بينهما:
</p>

<pre class="ipsCode">#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"
</pre>

<p>
	عرّفنا في بداية السكربت متغيرين عامين Global هما <code>v1</code> و <code>v2</code>، ثم في داخل الدالة <code>()myfun</code> عرّفنا متغير محلي Local يدعى <code>v1</code> باستخدام الكلمة المفتاحية <code>local</code>، وعدّلنا قيمة المتغير العام <code>v2</code>، نلاحظ أننا نستطيع استخدام الاسم نفسه لمتغيرات محلية مختلفة في دوال مختلفة.
</p>

<p>
	إذا شغّلنا السكربت الآن سنحصل على النتيجة التالية:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D
</pre>

<p>
	نستنتج من المثال السابق ما يلي:
</p>

<ul>
	<li>
		إذا كان لدينا متغير محلي ومتغير عام لهما الاسم نفسه، فإن المتغير المحلي يتمتع بالأولوية داخل الدالة
	</li>
	<li>
		يمكننا تعديل قيمة متغير عام من داخل الدالة
	</li>
</ul>

<h2 id="recursivefunctions">
	الدوال العودية Recursive Functions
</h2>

<p>
	الدالة العودية recursive function هي دالة تستدعي نفسها مرات عدة حتى الوصول للشرط المطلوب، وهي تفيدنا في التعامل مع المسائل البرمجية التي يمكن تقسيمها إلى مسائل أصغر مشابهة لها.
</p>

<p>
	تُعدّ دالة <a href="https://ar.wikipedia.org/wiki/%D8%B9%D8%A7%D9%85%D9%84%D9%8A" rel="external nofollow">حساب العاملي factorial function</a> مثال تقليدي على التعادوية، يوضحه السكربت factorial.sh التالي:
</p>

<pre class="ipsCode">#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6
</pre>

<p>
	تبدأ كل دالة عودية بتعريف حالة أساسية أو حدّية base case وعند الوصول إليها تنتهي الاستدعاءات الذاتية للدالة أي تنتهي العودية، والحالة الحدّية للدالة <code>()factorial</code> في مثالنا السابق الواحد حيث أن عاملي العدد 1 هو العدد 1:
</p>

<pre class="ipsCode">if [ $1 -le 1 ]; then
echo 1
</pre>

<p>
	لنوضح الآن الحالة العودية في دالة حساب العاملي: إن حساب العاملي لأي عدد صحيح موجب مثل n يساوي قيمة العدد n مضروبًا بحساب العاملي للعدد الأصغر منه n-1 وهكذا وفق المعادلة التالية:
</p>

<pre class="ipsCode">factorial(n) = n * factorial(n-1)
</pre>

<p>
	وقد استخدمنا هذه المعادلة في كتابة الحالة العودية recursive case للدالة السابقة وفق التالي:
</p>

<pre class="ipsCode">last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
</pre>

<p>
	لنشغّل السكربت ونتأكد من صحة النتائج:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720
</pre>

<p>
	يمكن تجربة أفكار أخرى لإتقان مفهوم الدوال العودية، لنحاول مثلًا حساب قيمة <a href="https://ar.wikipedia.org/wiki/%D9%85%D8%AA%D8%AA%D8%A7%D9%84%D9%8A%D8%A9_%D9%81%D9%8A%D8%A8%D9%88%D9%86%D8%A7%D8%AA%D8%B4%D9%8A" rel="external nofollow">سلسلة فيبوناتشي</a> لعدد معين، علينا أن نحدد في البداية الحالة الأساسية ثم الحالة العودية وبعدها نكتب السكربت.
</p>

<h2>
	الخاتمة
</h2>

<p>
	وصلنا إلى ختام مقالنا الذي شرحنا فيه أهمية الدوال البرمجية التقليدية والدوال التعاودية وحالات استخدامها في سكربتات باش، نأمل أنه كان مفيدًا، تابع مقالنا التالي والأخير حيث سنطبق فيه كل المبادئ التي تعلمناها على في كافة مقالات <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">سلسلة تعلم باش</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-functions/" rel="external nofollow">Using Functions in Bash</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r831/" rel="">الحلقات في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/" rel="">أنشئ برنامجك النصي الأول على صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r257/" rel="">استخدام الدوال في سكربات الصدفة Shell Scripts</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/" rel="">عمليات السلاسل النصية في باش Bash</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">832</guid><pubDate>Sat, 11 Jan 2025 15:07:03 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62D;&#x644;&#x642;&#x627;&#x62A; &#x641;&#x64A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r831/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_01/---Bash.jpg.e2423f2aaa1f50163caeb5eef72c6311.jpg" /></p>
<p>
	الحلقات Loops ضرورية في أي لغة برمجة، ولها حالات استخدام متعددة في سكربتات باش سنتعلمها معًا في هذا المقال، وسنتعرف على حلقات For و While و Until، وعلى كيفية التحكم بالحلقات باستخدام تعليمات <code>break</code> و <code>continue</code>، بالإضافة لطريقة كتابة الحلقات اللانهائية، وكيف أنها قد تشير في بعض الأحيان لوجود أخطاء في كتابة السكربت.
</p>

<h2 id="for">
	حلقات For في باش
</h2>

<p>
	حلقة for هي واحدة من ثلاثة أنواع من <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1306/" rel="">الحلقات التكرارية</a> التي يمكننا استخدامها في سكربتات باش، وهي تكتب بطريقتين:
</p>

<ul>
	<li>
		حلقة for المكتوبة بأسلوب لغة C
	</li>
	<li>
		حلقة for المعتمدة على قائمة أو مجال محدد من العناصر
	</li>
</ul>

<h3 id="forc">
	كتابة حلقة for بأسلوب لغة C في سكربتات باش
</h3>

<p>
	نكتب هذا النوع من حلقات for بالطريقة نفسها التي نكتبها في لغات البرمجة <a href="https://academy.hsoub.com/programming/c/" rel="">C</a> و <a href="https://academy.hsoub.com/programming/cpp/" rel="">++C</a> وفق الصيغة العامة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2964_6" style=""><span class="kwd">for</span><span class="pln"> </span><span class="pun">((</span><span class="pln">initialize </span><span class="pun">;</span><span class="pln"> condition </span><span class="pun">;</span><span class="pln"> increment</span><span class="pun">));</span><span class="pln"> </span><span class="kwd">do</span><span class="pln">
</span><span class="pun">[</span><span class="pln">COMMANDS</span><span class="pun">]</span><span class="pln">
done</span></pre>

<p>
	إذا طبقنا الصيغة العامة السابقة على المثال أدناه، فإن تنفيذ الحلقة الموجودة فيه سيعرض عبارة "Hello Friend" عشر مرات على شاشة <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A7%D8%AD%D8%AA%D8%B1%D8%A7%D9%81-r367/" rel="">الطرفية</a>:
</p>

<pre class="ipsCode">for ((i = 0 ; i &lt; 10 ; i++)); do
    echo "Hello Friend"
done
</pre>

<p>
	لنفسر الشيفرة السابقة: القيمة الابتدائية لمتغير الحلقة هي 0، وشرط التكرار أن لا تتجاوز قيمة المتغير العدد 10، ومقدار الزيادة هو 1، وبالتالي في كل مرة يتحقق فيها شرط الحلقة سيُنفذ الأمر البرمجي وهو في حالتنا عرض العبارة Hello Friend على الشاشة وتزداد قيمة متغير الحلقة i بمقدار واحد، ثم يُفحص الشرط من جديد وهكذا حتى الوصول للحد الأعلى أي 10.
</p>

<p>
	وهذه نتيجة تنفيذ الحلقة:
</p>

<pre class="ipsCode">kabary@handbook:~$ bash hello.sh 
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
</pre>

<h3 id="for-1">
	كتابة حلقة for المعتمدة على القوائم في سكربتات باش
</h3>

<p>
	تفيدنا حلقة for المكتوبة بهذه الطريقة في الحالات التي نتعامل فيها مع قائمة معروفة العناصر، مثل: مجموعة ملفات أو مجموعة سلاسل نصية، أو مجال محدد من الأعداد، أو مصفوفة، أو ربما مخرجات ثابتة لأمر معين أو غير ذلك، ولها الصيغة العامة التالية:
</p>

<pre class="ipsCode">for item in [LIST]; do
[COMMANDS]
done
</pre>

<p>
	يبين المثال أدناه الحلقة نفسها التي تعاملنا معها في الفقرة السابقة ولكنها مكتوبة هذه المرة بطريقة القائمة:
</p>

<pre class="ipsCode">for i in {1..10}; do
    echo "Hello Friend"
done
</pre>

<p>
	وهذا مثال آخر حيث يعرض السكربت var.sh التالي جميع الملفات الموجودة في المجلد <code>var/</code>:
</p>

<pre class="ipsCode">#!/bin/bash

for i in /var/*; do
    echo $i 
done
</pre>

<p>
	وسنحصل في الخرج على نتيجة تشبه ما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
</pre>

<h2 id="while">
	حلقات While في باش
</h2>

<p>
	هذه هي الصيغة العامة لحلقة while في باش:
</p>

<pre class="ipsCode">while [ condition ]; do
[COMMANDS]
done
</pre>

<p>
	لنطبق مثالًا عمليًّا: يعرض السكربت التالي المضاعفات العشرة الأولى للعدد 3:
</p>

<pre class="ipsCode">#!/bin/bash

num=1
while [ $num -le 10 ]; do
    echo $(($num * 3))
    num=$(($num+1))
done
</pre>

<p>
	وسيكون الخرج كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
</pre>

<p>
	لنُحلّل السكربت أعلاه، في البداية أعطينا المتغير <code>num</code> القيمة الابتدائية 1، وحددنا شرط تكرار الحلقة بأن لا تتجاوز قيمة المتغير العدد 10، وبناءً على ذلك سيُنَفَذ الأمران الموجودان في جسم الحلقة وهما أولًا إظهار ناتج ضرب قيمة المتغير <code>num</code> بالعدد 3 على الشاشة، وثانيًا زيادة قيمة <code>num</code> بمقدار 1، ويُعاد تنفيذهما مرارًا وتكرارًا طالما أن شرط الحلقة محقق.
</p>

<h2 id="until">
	حلقات Until في باش
</h2>

<p>
	النوع الثالث من الحلقات التكرارية باش هو until، وليس الحلقة do-while التي اعتاد عليها مبرمجو لغة C و ++C، وكما نلاحظ أدناه فالصيغة العامة لحلقة until مطابقة تمامًا لصيغة كتابة حلقة while:
</p>

<pre class="ipsCode">until [ condition ]; do
[COMMANDS]
Done
</pre>

<p>
	ويكمن الفرق بينهما في طريقة تعامل كل حلقة مع نتيجة اختبار الشرط فيما إذا كان محققًا أو غير محقق، ففي الحلقة while يستمر التنفيذ طالما أن شرط الحلقة محقق، وعلى العكس تمامًا في الحلقة until إذ يستمر التنفيذ طالما أن الشرط غير محقق.
</p>

<p>
	لنكتب الآن السكربت السابق باستخدام الحلقة until بدلًا من while، دقق جيدًا في الشرط فهو جوهر الاختلاف بين السكربتين:
</p>

<pre class="ipsCode">#!/bin/bash

num=1
until [ $num -gt 10 ]; do
    echo $(($num * 3))
    num=$(($num+1))
done
</pre>

<p>
	الشرط هنا هو أن تكون قيمة المتغير <code>num</code> أكبر من 10، بينما كان الشرط في سكربت while هو أن تكون قيمة المتغير <code>num</code> أصغر من 10وهما كما تلاحظ عكس بعضهما تمامًا.
</p>

<h2 id="">
	حالات شائعة لاستخدام الحلقات في باش
</h2>

<p>
	بعد أن تعرفنا على أساسيات الحلقات، سنعرض بعضًا من أشهر استخداماتها في باش:
</p>

<h3 id="-1">
	إظهار عناصر مصفوفة بواسطة سكربت باش
</h3>

<p>
	تُعدّ الحلقة for خيارًا مناسبًا لعرض عناصر أي مصفوفة في باش، يمكن الرجوع لمقالنا <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/" rel="">استخدام المصفوفات في باش Bash</a> لمعرفة كيفية إنشاء مصفوفات باش والتعامل معها.
</p>

<p>
	ألقِ نظرة على السكربت prime.sh التالي، إنه يتضمن مصفوفة تسمى prime وحلقة for تمر على عناصر المصفوفة واحدًا تلو الآخر وتُظهرهم على الشاشة بواسطة الأمر <code>echo</code>:
</p>

<pre class="ipsCode">#!/bin/bash

prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
    echo $i
done 
</pre>

<p>
	وسيكون الخرج كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
</pre>

<h3 id="breakcontinue">
	استخدام break و continue في حلقات باش
</h3>

<p>
	تساعدنا تعليمات <code>break</code> و <code>continue</code> على إنهاء تنفيذ الحلقة قبل الأوان أو تخطي بعضًا من تكراراتها لأغراض تخدم برنامجنا.
</p>

<p>
	توقف التعليمة <code>break</code> تنفيذ الحلقة وتنقل التنفيذ إلى التعليمة التالية في البرنامج، فعلى سبيل المثال ستعرض الحلقة التالية الأعداد من واحد إلى ثلاثة فقط على شاشة الطرفية:
</p>

<pre class="ipsCode">for ((i=1;i&lt;=10;i++)); do
    echo $i
    if [ $i -eq 3 ]; then
        break
    fi
done
</pre>

<p>
	وتساعدنا التعليمة <code>continue</code> على تجاوز بعض التكرارات، فكلما وصل تسلسل التنفيذ إلى <code>continue</code> تُهمَل الأوامر التي تليها والتي تقابل قيمًا معينة للمتغير نود تجاوزها، ويُكرر تنفيذ الحلقة بعد زيادة قيمة المتغير.
</p>

<p>
	يبين السكربت odd.sh التالي كيفية استخدام <code>continue</code> لتخطي الأعداد الزوجية وإظهار الأعداد الفردية فقط من بين الأعداد من صفر إلى عشرة:
</p>

<pre class="ipsCode">#!/bin/bash
for ((i=0;i&lt;=10;i++)); do
    if [ $(($i % 2)) -ne 1 ]; then
        continue
    fi
    echo $i
done
</pre>

<p>
	وستحصل على هذا الخرج:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./odd.sh
1
3
5
7
9
</pre>

<h3 id="-2">
	الحلقات اللانهائية في باش
</h3>

<p>
	الحلقات اللانهائية Infinite Loops هي حلقات دائمة التكرار بدون نهاية لأن شرط تكرارها محقق دائمًا. قد يبني المستخدم حلقات لانهائية عن قصد لأهداف معينة، لكن معظم الحلقات النهائية في واقع الأمر تظهر نتيجة أخطاء بشرية غير مقصودة.
</p>

<p>
	الهدف من إنشاء الحلقة التالية مثلًا هو إظهار الأرقام من واحد إلى عشرة على شاشة الطرفية لكن بترتيب تنازلي، إذا دققنا فيها سنكتشف خطأ يوقع المستخدم ضحية تكرار لا نهائي للحلقة:
</p>

<pre class="ipsCode">for ((i=10;i&gt;0;i++)); do
    echo $i
done 
</pre>

<p>
	إذا دققنا في الكود أعلاه سنلاحظ أن مُنشئ الحلقة هنا يزيد قيمة المتغير <code>i</code> بمقدار واحد بعد كل تنفيذ بدلًا من إنقاصها بمقدار واحد ليصل في النهاية إلى القيمة صفر وهي شرط انتهاء الحلقة، فحتى تعمل الحلقة بالصورة المطلوبة علينا استبدال <code>++i</code> بالتعليمة <code>--i</code> لتصبح كما يلي:
</p>

<pre class="ipsCode">for ((i=10;i&gt;0;i--)); do
    echo $i
done 
</pre>

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

<p>
	صيغة بناء حلقة لا نهائية باستخدام حلقة for:
</p>

<pre class="ipsCode">for ((;;)); do
    [COMMANDS]
done 
</pre>

<p>
	صيغة بناء حلقة لا نهائية باستخدام حلقة while:
</p>

<pre class="ipsCode">while [ true ]; do
    [COMMANDS]
done
</pre>

<h2>
	الخلاصة
</h2>

<p>
	انتهى مقالنا الخاص بالحلقات التكرارية في سكربتات باش، عرضنا فيه الحلقات الأساسية الثلاث مع بعض الأمثلة العملية ووضحنا حالات الاستخدام الخاصة بكل حلقة، ندعوك لمتابعة المقال التالي حول <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r832/" rel="">الدوال في باش</a> وتطبيق المزيد من المفاهيم المتقدمة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-loops/" rel="external nofollow">Loops in Bash</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/" rel="">الجمل الشرطية في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-flow-control-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%C2%A0%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-1-r260/" rel="">كيف تستخدم بنى التحكم في سكربتات الصدفة Shell Scripts - الجزء 1</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-flow-control-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%C2%A0%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-2-r268/" rel="">كيف تستخدم بنى التحكم في سكربتات الصدفة Shell Scripts - الجزء 2</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A8%D9%86%D9%89-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-flow-control-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-3-r273/" rel="">كيف تستخدم بنى التحكم في سكربتات الصدفة Shell Scripts - الجزء 3</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">831</guid><pubDate>Sat, 04 Jan 2025 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62C;&#x645;&#x644; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/--If--Else--Case---Bash.jpg.c02e235ac26f6af74cdfd3d631cbf3ed.jpg" /></p>
<p>
	سنتعلم في هذا المقال كيفية استخدام الجمل والعبارات الشرطية الشائعة مثل if و else و case لكتابة سكربتات باش فعالة، ونتعرف على طريقة التعامل مع سيناريوهات متعددة واتخاذ القرارات المناسبة من خلالها.
</p>

<h2 id="if">
	استخدام الجملة الشرطية if في باش
</h2>

<p>
	يعد الشرط if العنصر الأساسي في أي بنية برمجية لاتخاذ القرار، ويمكن كتابة الشرط في باش وفق الصيغة العامة التالية:
</p>

<pre class="ipsCode">if [ condition ]; then
  your code
fi
</pre>

<p>
	نلاحظ أن كل عبارات if الشرطية تبدأ في باش بالأمر <code>if</code> وتنتهي بالأمر <code>fi</code> أي if معكوسة. ويجب الانتباه للمسافات الفارغة عند كتابة الجمل الشرطية فهي ذات أهمية، وهذه مواضعها:
</p>

<ul>
	<li>
		توجد مسافة فارغة قبل الشرط condition المكتوب بين قوسين وبعده، وإذا أهملناها سنحصل على خطأ
	</li>
	<li>
		توجد مسافة فارغة قبل وبعد العوامل الشرطية مثل = أو == أو =&gt; وعدم الالتزام بها سيعطينا رسالة خطأ مفادها unary operator expected أي يتوقع تشغيل عامل فردي.
	</li>
</ul>

<p>
	لنجرب الآن كتابة سكربت بسيط باسم root.sh، يعرض على الشاشة عبارة "You are root" في حالة واحدة فقط إذا كان المستخدم الذي ينفذ السكربت هو الجذر root:
</p>

<pre class="ipsCode">#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
fi
</pre>

<p>
	اعتمدنا في هذا السكربت على الأمر <code>whoami</code> الذي يعطينا اسم المستخدم مُنفّذ السكربت، وكتابته ضمن قوسين هلاليين مع رمز الدولار بالصيغة التالية <code>(command)$</code> فتعني حصولنا على خرج الأمر بهيئة متغير، تدعى هذه العملية <strong>تعويض الأوامر command substitutions</strong> وقد تعرفنا عليها في مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">المتغيرات في سكربتات الصدفة باش Bash</a>.
</p>

<p>
	إذًا سيتحقق الشرط الوارد في جملة <code>if</code> ويطبع العبارة المطلوبة في حالة واحدة فقط وهي عندما ينفذ السكربت المستخدم الجذر root، وتظهر الصورة التالية نتيجة التنفيذ:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="164167" href="https://academy.hsoub.com/uploads/monthly_2024_12/01--if--.png.1544790bc0b5c8cfdc8754072495fbda.png" rel=""><img alt="01 تعليمة if في باش" class="ipsImage ipsImage_thumbnailed" data-fileid="164167" data-unique="inrvro06n" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/01--if--.png.1544790bc0b5c8cfdc8754072495fbda.png"> </a>
</p>

<h2 id="ifelse">
	استخدام الجملة الشرطية if-else في باش
</h2>

<p>
	يمكننا تضمين أي تعليمة برمجية نريد تنفيذها عندما لا يتحقق الشرط <code>if</code> في الجملة الشرطية <code>else</code> فإذا عدنا للسكربت السابق root.sh مثلًا، وعدّلنا محتواه حتى يعطينا خرجًا معينًا عند عدم تحقق الشرط، فالسكربت في وضعه الحالي لا يظهر لنا أي نتيجة عند التنفيذ من مستخدم آخر غير الجذر وعندما نعدله على النحو التالي:
</p>

<pre class="ipsCode">#!/bin/bash

if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi
</pre>

<p>
	ونحاول تشغيل السكربت من حساب المستخدم العادي، سنحصل على تنبيه يخبرنا أن المستخدم ليس المستخدم الجذر كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./root.sh
You are not root
</pre>

<h2 id="elseif">
	استخدام الجملة الشرطية else-if في باش
</h2>

<p>
	تساعدنا الجملة الشرطية <code>else-if</code> على اختبار أكثر من شرط في الوقت نفسه، وتكتب اختصارًا <code>elif</code>. لنلاحظ على سبيل المثال السكربت age.sh التالي الذي يأخذ معامل العمر <code>AGE</code> كوسيط ويعطينا نتيجة حسب الشروط المحددة في <code>if</code> و <code>elif</code>:
</p>

<pre class="ipsCode">#!/bin/bash

AGE=$1

if [ $AGE -lt 13 ]; then
    echo "You are a kid."
elif [ $AGE -lt 20 ]; then
    echo "You are a teenager."
elif [ $AGE -lt 65 ]; then
    echo "You are an adult."
else
    echo "You are an elder."
fi
</pre>

<p>
	يمكنك العودة لمقال <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/" rel="">تمرير الوسطاء إلى سكربت باش Bash</a> لمطالعة مزيد من المعلومات عن تمرير الوسطاء لسكربتات باش. لننفذ السكربت الآن مع قيم مختلفة لمتغير العمر <code>AGE</code> ونلاحظ النتائج كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./age.sh 11
You are a kid.
kabary@handbook:~$ ./age.sh 18
You are a teenager.
kabary@handbook:~$ ./age.sh 44
You are an adult.
kabary@handbook:~$ ./age.sh 70
You are an elder.
</pre>

<p>
	استخدمنا الشرط <code>lt</code> وهو اختصار للعبارة الإنجليزية less than أي أصغر من لاختبار قيمة المتغير <code>AGE$</code>.
</p>

<p>
	وتجدر الإشارة لكوننا نستطيع استخدام الجملة الشرطية <code>elif</code> بقدر ما نريد في بنية <code>else-if</code>، أما <code>else</code> فلا تُكتَب فيها إلا مرة واحدة فقط، وأن كافة جمل <code>if</code> الشرطية ينبغي أن تُغلق باستخدام <code>fi</code>.
</p>

<h2 id="if-1">
	استخدام جمل if الشرطية المتداخلة في باش
</h2>

<p>
	يُقصد بالجمل الشرطية المتداخلة استخدام جمل <code>if</code> الشرطية داخل جمل <code>if</code> أخرى، لننظر على السكربت التالي weather.sh لتوضيح الأمر:
</p>

<pre class="ipsCode">#!/bin/bash

TEMP=$1

if [ $TEMP -gt 5 ]; then
    if [ $TEMP -lt 15 ]; then
        echo "The weather is cold."
    elif [ $TEMP -lt 25 ]; then
        echo "The weather is nice."
    else
        echo "The weather is hot."
    fi
else
    echo "It's freezing outside ..."
fi
</pre>

<p>
	يُظهِر هذا السكربت عبارات تصف الطقس بحسب درجة الحرارة المعطاة له ضمن الوسيط <code>TEMP</code>، فإذا كانت درجة الحرارة أكبر من 5 درجات فستُفَعَل عندها الجملة الشرطية الداخلية <code>if-elif</code>، دعنا نعطي السكربت بعض القيم المتفاوتة ونلاحظ النتائج:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./weather.sh 0
It's freezing outside ...
kabary@handbook:~$ ./weather.sh 8
The weather is cold.
kabary@handbook:~$ ./weather.sh 16
The weather is nice.
kabary@handbook:~$ ./weather.sh 30
The weather is hot.
</pre>

<h2 id="case">
	استخدام الجملة الشرطية case في باش
</h2>

<p>
	الجملة الشرطية <code>case</code> هي بديل مناسب يغني في بعض الحالات التعقيد المصاحب لكثرة استخدام <code>if</code> ضمن السكربت، فالجملة <code>case</code> أسهل في القراءة والإعداد، وهذه صيغتها العامة:
</p>

<pre class="ipsCode">case "variable" in
    "pattern1" )
        Command … ;;
    "pattern2" )
        Command … ;;
    "pattern2" )
        Command … ;;
esac
</pre>

<p>
	لننتبه للتالي عند كتابة <code>case</code>:
</p>

<ul>
	<li>
		توجد مسافة فارغة وقوس هلالي <code>)</code> بعد كل حالة أو نمط من أنماط الجملة الشرطية <code>case</code>
	</li>
	<li>
		تنتهي جميع الأوامر بمسافة فارغة وفاصلة منقوطة مزدوجة <code>;;</code> والمسافة الفارغة هنا إلزامية
	</li>
	<li>
		تنتهي جملة <code>case</code> دائمًا بالأمر <code>esac</code> وهو عبارة عن كلمة case معكوسة
	</li>
</ul>

<p>
	أكثر حالات استخدام <code>case</code> عند مطابقة المتغير مع أنماط أو خيارات محددة وواضحة كما في السكربت <code>char.sh</code> التالي:
</p>

<pre class="ipsCode">CHAR=$1

case $CHAR in
[a-z])
echo "Small Alphabet." ;;
[A-Z])
echo "Big Alphabet." ;;
[0-9])
echo "Number." ;;
*)
echo "Special Character."
esac
</pre>

<p>
	يقبل هذا السكربت وسيطًا واحدًا هو <code>CHAR</code>، وتطابق الجملة <code>case</code> قيمته مع مجموعة أنماط، لتقرر فيما إذا كان المتغير حرفًا أبجديًا كبيرًا أو صغيرًا، أو عددًا أو محرفًا خاصًا. لنلاحظ نتائج تنفيذ السكربت مع قيم مختلفة للمتغير:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./char.sh a
Small Alphabet.
kabary@handbook:~$ ./char.sh Z
Big Alphabet.
kabary@handbook:~$ ./char.sh 7
Number.
kabary@handbook:~$ ./char.sh $
Special Character.
</pre>

<p>
	يُمثل رمز النجمة <code>*</code> هنا الحالة الافتراضية للجملة <code>case</code> وهو يقابل <code>else</code> في جملة <code>if</code> الشرطية.
</p>

<h2 id="">
	شروط الاختبار في باش
</h2>

<p>
	تعتمد شروط الاختبار المستخدمة في الجمل الشرطية السابقة في نهاية الأمر على معاملات منطقية، وتختلف طبيعتها حسب نوع البيانات المتعامل معها سواء كانت أعدادًا أو سلاسل نصية أو ملفات، ويبين الجدول التالي أشهر هذه الشروط:
</p>

<table>
	<thead>
		<tr>
			<th style="text-align: right;">
				الشرط
			</th>
			<th style="text-align: right;">
				المكافئ
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				a <strong>-lt</strong> $b$
			</td>
			<td>
				قيمة a أصغر من قيمة b
			</td>
		</tr>
		<tr>
			<td>
				a <strong>-gt</strong> $b$
			</td>
			<td>
				قيمة a أكبر من قيمة b
			</td>
		</tr>
		<tr>
			<td>
				a <strong>-le</strong> $b$
			</td>
			<td>
				قيمة a أصغر أو تساوي قيمة b
			</td>
		</tr>
		<tr>
			<td>
				a <strong>-ge</strong> $b$
			</td>
			<td>
				قيمة a أكبر أو تساوي قيمة b
			</td>
		</tr>
		<tr>
			<td>
				a <strong>-eq</strong> $b$
			</td>
			<td>
				قيمة a تساوي قيمة b
			</td>
		</tr>
		<tr>
			<td>
				a <strong>-ne</strong> $b$
			</td>
			<td>
				قيمة a لا تساوي قيمة b
			</td>
		</tr>
		<tr>
			<td>
				<strong>e</strong> $FILE<strong>-</strong>
			</td>
			<td>
				المتغير FILE$ موجود
			</td>
		</tr>
		<tr>
			<td>
				<strong>d</strong> $FILE<strong>-</strong>
			</td>
			<td>
				المتغير FILE$ موجود وهو مجلد
			</td>
		</tr>
		<tr>
			<td>
				<strong>f</strong> $FILE<strong>-</strong>
			</td>
			<td>
				المتغير FILE$ موجود وهو ملف عادي
			</td>
		</tr>
		<tr>
			<td>
				<strong>L</strong> $FILE<strong>-</strong>
			</td>
			<td>
				المتغير FILE$ موجود وهو رابط مرن soft link
			</td>
		</tr>
		<tr>
			<td>
				‎$STRING1 <strong>=</strong> $STRING2‎
			</td>
			<td>
				قيمة السلسلة النصية STRING1 تساوي قيمة السلسلة النصية STRING2
			</td>
		</tr>
		<tr>
			<td>
				‎$STRING1 <strong>!=</strong> $STRING2
			</td>
			<td>
				قيمة السلسلة النصية STRING1 لا تساوي قيمة السلسلة النصية STRING2
			</td>
		</tr>
		<tr>
			<td>
				‎<strong>-z</strong> $STRING1
			</td>
			<td>
				قيمة السلسلة النصية STRING1 فارغة
			</td>
		</tr>
	</tbody>
</table>

<p>
	لا يتوجب حفظ هذه الشروط عن ظهر قلب فهي متوفرة في<a href="https://linuxhandbook.com/man-pages/" rel="external nofollow"> دليل مساعد</a>  يشرح طريقة كتابتها عندما نحتاجها، ويمكننا الوصول إليه بالتعليمة التالية:
</p>

<pre class="ipsCode">kabary@handbook:~$ man test
</pre>

<p>
	لنطبق مثالًا عمليًّا على شروط باش، سننشئ السكربت filetype.sh الذي يبين طبيعة العنصر المعطى له إذا كان ملفًا أو مجلدًا أو رابطًا مرنًا soft link:
</p>

<pre class="ipsCode">#!/bin/bash

if [ $# -ne 1 ]; then
    echo "Error: Invalid number of arguments"
     exit 1
fi

file=$1

if [ -f $file ]; then
    echo "$file is a regular file."
elif [ -L $file ]; then
    echo "$file is a soft link."
elif [ -d $file ]; then
    echo "$file is a directory."
else
    echo "$file does not exist"
fi
</pre>

<p>
	تفحص الجملة الشرطية الموجودة في بداية السكربت عدد الوسطاء الممررة له، وإذا تبين عدم وجود أي وسيط أو كان عدد الوسطاء أكبر من 1 فستُنهي هذه الجملة تنفيذ السكربت دون الانتقال للخطوة التالية، وتعطي المستخدم رسالة تحذيرية تطالبه بالتأكد من صحة الوسطاء المقدمة.
</p>

<p>
	لننفذ السكربت على عناصر مختلفة ونتفقد النتائج:
</p>

<pre class="ipsCode">kabary@handbook:~$ ./filetype.sh weather.sh
weather.sh is a regular file.
kabary@handbook:~$ ./filetype.sh /bin
/bin is a soft link.
kabary@handbook:~$ ./filetype.sh /var
/var is a directory.
kabary@handbook:~$ ./filetype.sh 
Error: Invalid number of arguments
</pre>

<h2 id="ifelse-1">
	طريقة كتابة جملة if-else في سطر واحد
</h2>

<p>
	يمكنك استخدام الجمل الشرطية <code>if-else</code> في ورؤية نتائجها في <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D9%83%D8%AA%D8%A7%D8%A8%D8%A9%20%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA%20%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9/" rel="">الصدفة shell</a> مباشرةً دون الحاجة لكتابتها في سكربت خاص وتنفيذه عند اللزوم، وهذا مثال:
</p>

<pre class="ipsCode">if [ $(whoami) = 'root' ]; then
    echo "You are root"
else
    echo "You are not root"
fi
</pre>

<p>
	بوسعنا كتابة هذا المثال في سطر واحد لتسهيل التعامل معه، ويجري ذلك بإضافة فاصلة منقوطة بين كل أمر وآخر كما يلي:
</p>

<pre class="ipsCode">if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
</pre>

<p>
	نستطيع الآن تنفيذه في الصدفة مباشرةً، لننسخه ونلصقه في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية terminal</a> ونلاحظ النتيجة.
</p>

<h2 id="-1">
	الخلاصة
</h2>

<p>
	حاولنا في هذه المقالة تكوين فكرةً عامة عن استخدام الجمل الشرطية في سكربتات باش من خلال أمثلة عملية متنوعة، ولفهم الموضوع بشكل أفضل ننصح بالتفكير بحالات اتخاذ قرار جديدة ومحاولة كتابة سكربتات مناسبة لها، فهذا من شأنه تعزيز فهم الموضوع والتعامل معه بكفاءة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/if-else-bash/" rel="external nofollow">Decision Making With If Else and Case Statements</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/" rel="">عمليات السلاسل النصية في باش Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/conditional_statements" rel="external">البُنى الشرطية في Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/more_advanced_if_usage" rel="external">الاستخدامات المتقدمة لعبارة if الشرطية في Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/using_case_statements" rel="external">استخدام البنية case في باش</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/script_basics" rel="external">أساسيات كتابة برامج Bash</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">830</guid><pubDate>Mon, 23 Dec 2024 15:01:01 +0000</pubDate></item><item><title>&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; &#x641;&#x64A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/-----Bash.jpg.d4559b0ea856b4a224dfbd5123dcd8bb.jpg" /></p>
<p>
	يدرك كل من تعامل مع <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">متغيرات باش</a> عدم وجود أي فرق بين تعريف متغير نوعه عدد صحيح int ومتغير نوعه سلسلة نصية string، فمهما كان نوع البيانات المتغير في باش هو متغير فقط.
</p>

<p>
	وقد تعرفنا في <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/" rel="">مقالنا السابق</a> على معاملات العمليات الحسابية للتعامل مع الأعداد، وسنتعرف في هذا المقال على وظائف باش الخاصة بالتعامل مع السلاسل النصية، مثل حساب طول سلسلة نصية، وربط السلاسل النصية ببعضها، واستخراج السلاسل النصية الفرعية منها، واستبدال السلاسل النصية الفرعية وغير ذلك.
</p>

<h2 id="">
	معرفة طول السلسلة النصية
</h2>

<p>
	السلسلة النصية string هي مجموعة أو مصفوفة من المحارف المتسلسلة فيما بينها. لنُعرّف سلسلة نصية جديدة أو متغير جديد في باش باسم distro مثلًا ونعطيه القيمة "Ubuntu" نكتب التالي:
</p>

<pre class="ipsCode">distro="Ubuntu"
</pre>

<p>
	يمكن الحصول على طول هذه السلسلة أي عدد محارفها بكتابة الرمز <code>#</code> قبل اسمها ضمن تعليمة <code>echo</code> كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${#distro}
6
</pre>

<p>
	تنحصر وظيفة الأمر <code>echo</code> بإظهار النتيجة، أما الصيغة <code>{string#}</code> فهي التي احتسبت طول السلسلة الفعلي.
</p>

<h2 id="-1">
	دمج السلاسل النصية
</h2>

<p>
	نعني بدمج السلاسل concatenation إلحاق سلسلة نصية أولى بنهاية سلسلة نصية أخرى للحصول على سلسلة أطول.
</p>

<p>
	لننشئ على سبيل المثال السلسلتين النصيتين "str1" و "str2" كما يلي:
</p>

<pre class="ipsCode">str1="hand"
str2="book"
</pre>

<p>
	لندمج الآن السلسلتين معًا ونخزن النتيجة بسلسلة ثالثة:
</p>

<pre class="ipsCode">str3=$str1$str2
</pre>

<p>
	توضح الصورة التالية النتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="164163" href="https://academy.hsoub.com/uploads/monthly_2024_12/01----.jpg.7af7c6a345ad8436ab04e97beaa14746.jpg" rel=""><img alt="01 دمج السلاسل في باش" class="ipsImage ipsImage_thumbnailed" data-fileid="164163" data-ratio="60.50" data-unique="oqea2rfim" style="width: 400px; height: auto;" width="400" src="https://academy.hsoub.com/uploads/monthly_2024_12/01----.jpg.7af7c6a345ad8436ab04e97beaa14746.jpg"> </a>
</p>

<h2 id="-2">
	إيجاد السلاسل النصية الفرعية
</h2>

<p>
	تساعدنا هذه العملية على فهرسة index أو إيجاد موضع محرف معين أو تسلسل محارف معين ضمن سلسلة نصية، لتوضيح الفكرة لننشئ السلسلة النصية "str" كالتالي:
</p>

<pre class="ipsCode">str="Bash is Cool"
</pre>

<p>
	يمكننا الآن معرفة موضع السلسلة الفرعية "Cool" ضمن الجملة السابقة باستخدام الأمر <code>expr</code>، وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ word="Cool"
kabary@handbook:~/scripts$ expr index "$str" "$word"
9
</pre>

<p>
	بعد تنفيذ الأمر حصلنا على العدد 9 في النتيجة، وهو يشير إلى ترتيب أول محرف من محارف السلسلة الفرعية "Cool" ضمن السلسلة الأصلية "Bash is Cool"، أي أنه مثل فهرس index لموضع السلسلة الفرعية.
</p>

<p>
	<strong>ملاحظة:</strong> لم نستخدم <a href="https://wiki.hsoub.com/Bash/introduction_to_if" rel="external">الجملة الشرطية <code>if</code></a> في الأمثلة التي أوردناها في هذا المقال لأننا سنخصص لها مقالًا لاحقًا.
</p>

<h2 id="-3">
	استخراج السلاسل النصية الفرعية
</h2>

<p>
	يعني استخراج سلسلة فرعية من سلسلة أخرى استخراج حرف أو كلمة أو مجموعة كلمات من سلسلة نصية معينة.
</p>

<p>
	سنكتب الأمر التالي لإنشاء سلسلة نصية جديدة اسمها "foss" كما يلي:
</p>

<pre class="ipsCode">foss="Fedora is a free operating system"
</pre>

<p>
	لنفترض الآن أننا نرغب باستخراج السلسلة الفرعية "fedora" من السلسلة السابقة، فكيف سننجز ذلك؟ ما نحتاجه هو فهرس السلسلة الفرعية أو موضع أول محرف فيها، بالإضافة إلى طولها الذي يُمثّل عدد المحارف التي نريد استخراجها.
</p>

<p>
	إذًا كي نستخرج السلسلة "fedora" سنبدأ من المحرف الذي ترتيبه 0، وسنستخرج بعده 6 محارف، وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${foss:0:6}
Fedora
</pre>

<p>
	نلاحظ أن ترتيب المحارف في سلاسل باش النصية يبدأ من الصفر وليس من الواحد، وهذا ينسجم مع ترتيب أول عنصر في <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/" rel="">مصفوفات باش</a> التي تبدأ دائمًا بالصفر. يمكننا أيضًا تحديد موضع البداية فقط وعدم ذكر عدد المحارف المطلوب استخراجها وعندها سيستخرج باش جميع المحارف من موضع البداية وحتى نهاية السلسلة.
</p>

<p>
	على سبيل المثال إذا أردنا استخراج السلسلة الفرعية "free operating system" من السلسلة "foss" السابقة، فسنحدد فقط موضع البداية وهو في حالتنا 12 كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${foss:12}
free operating system
</pre>

<h2 id="-4">
	استبدال السلاسل النصية الفرعية
</h2>

<p>
	تتيح لنا هذه العملية استبدال سلسلة نصية فرعية بسلسلة أخرى، فيمكننا على سبيل المثال استبدال السلسلة النصية الفرعية "fedora" بالسلسلة النصية الفرعية "Ubuntu" ضمن السلسلة "foss" السابقة، وذلك وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${foss/Fedora/Ubuntu}
Ubuntu is a free operating system
</pre>

<p>
	لنجرب استبدالًا آخر وهو تبديل السلسلة "free" بالسلسلة "popular" مثلًا:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${foss/free/popular}
Fedora is a popular operating system
</pre>

<p>
	تجدر الإشارة هنا لأننا أجرينا في كلا المثالين السابقين استبدالًا ظاهريًا للسلاسل النصية الفرعية أي عند عرض السلاسل فقط من خلال الأمر <code>echo</code>، حيث أظهرنا السلسلة مرة باستبدال "fedora" ومرة "free" لكننا لم نبدل القيمة الفعلية للسلسلة "foss" حيث بقيت القيمة المخزنة فيها كما هي.
</p>

<h2 id="-5">
	حذف السلاسل النصية الفرعية
</h2>

<p>
	يمكننا حذف أي سلسلة نصية فرعية من أي سلسلة نريدها باستخدام <code>/</code>، لننشئ مثلًا السلسلة النصية "fact" التالية:
</p>

<pre class="ipsCode">fact="Sun is a big star"
</pre>

<p>
	لنحذف منها السلسلة الفرعية "big":
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${fact/big}
Sun is a star
</pre>

<p>
	لننشئ سلسلة أخرى مختلفة قليلًا اسمها "cell":
</p>

<pre class="ipsCode">cell="112-358-1321"
</pre>

<p>
	لنفترض أننا نريد حذف الشرطات "-" منها، فإذا كتبنا الأمر التالي فإنه سيحذف الشرطة الأولى فقط كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${cell/-}
112358-1321
</pre>

<p>
	أما لحذف جميع الشرطات الموجودة في السلسلة فينبغي كتابة الرمز <code>/</code> مرتين، وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${cell//-}
1123581321
</pre>

<p>
	نلاحظ أننا نحذف السلاسل النصية الفرعية في خرج الأمر <code>echo</code> فقط ولم نحذفها من القيمة الأصلية للسلسلة النصية "cell" التي بقيت كما هي ولم تتأثر بالحذف.
</p>

<p>
	أما إذا رغبنا بتعديل القيمة الأصلية للسلسلة النصية، وحذف الشرطات منها فعليًّا، فهذه هي الطريقة:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo $cell
112-358-1321
kabary@handbook:~/scripts$ cell=${cell//-}
kabary@handbook:~/scripts$ echo $cell
1123581321
</pre>

<h2 id="-6">
	تغيير حالة الحروف بين كبيرة وصغيرة في السلاسل النصية
</h2>

<p>
	يتيح لنا باش تغيير حالة الحروف الأبجدية في السلاسل النصية من كبيرة إلى صغيرة أو بالعكس بسهولة. لننشئ في البداية سلسلتين نصيتين كما يلي:
</p>

<pre class="ipsCode">legend="john nash"
actor="JULIA ROBERTS"
</pre>

<p>
	لنحوّل حالة الحروف في السلسلة النصية الأولى "legend" من حروف صغيرة إلى حروف كبيرة، وفق التالي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${legend^^}
JOHN NASH
</pre>

<p>
	ولنحول أيضًا حروف السلسلة النصية "actor" إلى حروف صغيرة:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${actor,,}
julia roberts
</pre>

<p>
	نستطيع أيضًا تحويل حالة الحرف الأول فقط في "legend" إلى حرف كبير:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${legend^}
John nash
</pre>

<p>
	والحرف الأول فقط في "actor" إلى حرف صغير:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${actor,}
jULIA ROBERTS
</pre>

<p>
	يمكننا أيضًا تحويل حالة حروف بعينها فقط من حروف كبيرة إلى صغيرة أو العكس؛ فعلى سبيل المثال يمكن تغيير الحرفين <code>j</code> و <code>n</code> من السلسلة النصية "legend" إلى حروف كبيرة كما يلي:
</p>

<pre class="ipsCode">kabary@handbook:~/scripts$ echo ${legend^^[jn]}
JohN Nash
</pre>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	بهذا نكون قد وصلنا إلى ختام المقال الذي شرحنا فيه كيفية التعامل مع السلاسل النصية في سكربتات باش، وسنتطرق في <span ipsnoautolink="true">المقال القادم</span> لشرح مهارات جديدة ونوضح طريقة اتخاذ القرار ضمن سكربتات باش من خلال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/" rel="">الجمل الشرطية</a> بمختلف أشكالها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-strings/" rel="external nofollow">String Operations in Bash</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/" rel="">استخدام المعاملات الحسابية في سكربتات باش Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/types_of_variables" rel="external">أنواع المتغيرات في Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/advantages_of_the_Bash" rel="external">ميزات صدفة Bash</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/executing_commands" rel="external">تنفيذ الأوامر في Bash</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">829</guid><pubDate>Fri, 13 Dec 2024 15:04:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x645;&#x639;&#x627;&#x645;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x62D;&#x633;&#x627;&#x628;&#x64A;&#x629; &#x641;&#x64A; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/------Bash.jpg.0614bda1ca396dc5edd3f783795907a1.jpg" /></p>
<p>
	تدخل العمليات الحسابية في العديد من سكربتات باش Bash Scripts، فقد تحتاج لحساب المساحة المتبقية من القرص الصلب مثلًا، أو حجوم الملفات أو عرض النطاق الترددي للشبكة، أو تواريخ انتهاء صلاحيات كلمات المرور، أو أعداد المضيفين hosts أو غير ذلك.
</p>

<p>
	وسنتعلم في مقالنا الخامس من <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">سلسلة باش للمبتدئين</a> طريقة استخدام معاملات باش bash operators لإجراء العمليات الحسابية داخل السكربت، وسنبدأ بجدول يتضمن المعاملات الحسابية:
</p>

<table>
	<thead>
		<tr>
			<th>
				المعامل
			</th>
			<th>
				الوصف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				+
			</td>
			<td>
				الجمع
			</td>
		</tr>
		<tr>
			<td>
				-
			</td>
			<td>
				الطرح
			</td>
		</tr>
		<tr>
			<td>
				*
			</td>
			<td>
				الضرب
			</td>
		</tr>
		<tr>
			<td>
				/
			</td>
			<td>
				قسمة الأعداد الصحيحة بدون بواقي عشرية
			</td>
		</tr>
		<tr>
			<td>
				%
			</td>
			<td>
				قسمة المعاملات التي تُرجع باقي عملية القسمة فقط
			</td>
		</tr>
		<tr>
			<td>
				**
			</td>
			<td>
				الأُس مثلًا x أُس y
			</td>
		</tr>
	</tbody>
</table>

<h2 id="">
	تنفيذ الجمع والطرح في باش
</h2>

<p>
	لننشئ سكربت باش يدعى مثلًا addition.sh يجمع حجمي ملفين بالبايت Byte ويعطيك النتيجة، سنستعمل في السكربت وسطاء باش وقد شرحنا طريقة طريقة التعامل معها في <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/" rel="">مقال تمرير الوسطاء إلى سكربت باش</a>، بالإضافة إلى الأمرين <code>cut</code> و <code>du</code>.
</p>

<p>
	يُستَخدَم الأمر <code>du</code> لمعرفة أحجام الملفات، ويمكن استخدام الراية أو الخيار <code>d-</code> بعد الأمر وهو اختصار لكلمة bytes لجعل المخرجات بالحجم الفعلي للملف بالبايتات فبدون هذا الخيار سيعرض <code>du</code> الحجم بالوحدة الافتراضية كيلوبايت. يُظهر هذا الأمر في النتيجة كلًا من اسم الملف وحجمه أي أنه يعطي عمودين أو مُخرَجَين، لذا سنحتاج الأمر <code>cut</code> لاقتطاع جزء النتيجة الذي نريده فقط وهو الحجم. وبالتالي سنستخدم أنبوب إعادة التوجيه <code>|</code> لتمرير خرج الأمر <code>du</code> إلى دخل الأمر <code>cut</code>.
</p>

<p>
	سيكون نص السكربت addition.sh كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_6" style=""><span class="com">#!/bin/bash</span><span class="pln">

fs1</span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="pln">du </span><span class="pun">-</span><span class="pln">b $1 </span><span class="pun">|</span><span class="pln"> cut </span><span class="pun">-</span><span class="pln">f1</span><span class="pun">)</span><span class="pln">
fs2</span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="pln">du </span><span class="pun">-</span><span class="pln">b $2 </span><span class="pun">|</span><span class="pln"> cut </span><span class="pun">-</span><span class="pln">f1</span><span class="pun">)</span><span class="pln">

echo </span><span class="str">"File size of $1 is: $fs1"</span><span class="pln">
echo </span><span class="str">"File size of $2 is: $fs2"</span><span class="pln">

total</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="pln">$fs1 </span><span class="pun">+</span><span class="pln"> $fs2</span><span class="pun">))</span><span class="pln">

echo </span><span class="str">"Total size is: $total"</span></pre>

<p>
	يحتاج السكربت السابق وسيطين، وهنا مرر له الملفين <code>etc/passwd/</code> و <code>etc/group/</code>، ثم نفذنا السكربت وسنحصل على النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_8" style=""><span class="pln">kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">addition</span><span class="pun">.</span><span class="pln">sh </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">passwd </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">group
</span><span class="typ">File</span><span class="pln"> size of </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">passwd is</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2795</span><span class="pln">
</span><span class="typ">File</span><span class="pln"> size of </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">group is</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1065</span><span class="pln">
</span><span class="typ">Total</span><span class="pln"> size is</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3860</span></pre>

<p>
	لاحظ السطر التالي الذي يتضمن عملية الجمع باستخدام المعامل <code>+</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_10" style=""><span class="pln">total</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="pln">$fs1 </span><span class="pun">+</span><span class="pln"> $fs2</span><span class="pun">))</span></pre>

<p>
	ينبغي أن تكتب العمليات الحسابية دائمًا بين قوسين هلاليين مزدوجين <code>(())</code> بالصيغة التالية:
</p>

<pre class="ipsCode">$((arithmetic-expression))
</pre>

<p>
	يمكنك استخدام معامل الطرح <code>-</code> بالطريقة نفسها، فمثلًا المتغير <code>sub</code> التالي سيحمل القيمة سبعة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_12" style=""><span class="pln">sub</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="lit">10</span><span class="pun">-</span><span class="lit">3</span><span class="pun">))</span></pre>

<h2 id="-1">
	تنفيذ عمليتي الضرب والقسمة في باش
</h2>

<p>
	لننشئ سكربت بسيط اسمه <code>giga2mega.sh</code> مثلًا يجري عملية التحويل من جيجا بايت GB إلى ميجا بايت MB وفق التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_14" style=""><span class="com">#!/bin/bash</span><span class="pln">

GIGA</span><span class="pun">=</span><span class="pln">$1
MEGA</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="pln">$GIGA </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">))</span><span class="pln">

echo </span><span class="str">"$GIGA GB is equal to $MEGA MB"</span></pre>

<p>
	لنُشغل السكربت الآن لنعرف كم تعادل 4 جيجا بايت بالميجا بايت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_16" style=""><span class="pln">kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">giga2mega</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">4</span><span class="pln">
</span><span class="lit">4</span><span class="pln"> GB is equal to </span><span class="lit">4096</span><span class="pln"> MB</span></pre>

<p>
	لقد استخدمنا معامل الضرب <code>*</code> لضرب عدد الجيجا بايت بالعدد 1024 للحصول على مكافئها بالميجا بايت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_18" style=""><span class="pln">MEGA</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="pln">$GIGA </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">))</span></pre>

<p>
	يمكنك تعديل السكربت نفسه ليحول الحجم من جيجا بايت إلى كيلو بايت:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_20" style=""><span class="pln">KILO</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="pln">$GIGA </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1024</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1024</span><span class="pun">))</span></pre>

<p>
	وبالطريقة نفسها حَوِّله إلى بايت.
</p>

<p>
	لنجرب الآن عملية القسمة باستخدام المعامل <code>/</code> كما يلي ونُخَزِّن النتيجة في المتغير <code>div</code> الذي سيحمل القيمة خمسة في مثالنا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_22" style=""><span class="pln">div</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="lit">20</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">4</span><span class="pun">))</span></pre>

<p>
	القسمة المستخدمة هنا هي قسمة الأعداد الصحيحة، وبالتالي ستكون النتيجة عددًا صحيحًا حتمًا، فلو قَسَّمتَ 5 على 2 باستخدام المعامل <code>/</code> فستحصل على 2 لأن هذه القسمة تهمل البواقي فهي لا تُرجع أعدادًا عشرية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_24" style=""><span class="pln">kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ div</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="lit">5</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">))</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ echo $div
</span><span class="lit">2</span></pre>

<p>
	إذا رغبت بالتعامل مع الأعداد العشرية فستحتاج للأمر <a href="https://linuxhandbook.com/bc-command/" rel="external nofollow"><code>bc</code></a>، وهذا مثال على طريقة استخدامه مع القسمة الصحيحة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_26" style=""><span class="pln">echo </span><span class="str">"5/2"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> bc </span><span class="pun">-</span><span class="pln">l
</span><span class="lit">2.50000000000000000000</span></pre>

<p>
	وتبين الصورة أدناه استخدامه مع العمليات الحسابية الأخرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163650" href="https://academy.hsoub.com/uploads/monthly_2024_12/img01-modulus-operation-bash-script.jpg.b3cd6ef10db5164a1e8b10f7c50c0dfd.jpg" rel=""><img alt="img01 modulus operation bash script" class="ipsImage ipsImage_thumbnailed" data-fileid="163650" data-unique="tvh2bqdg1" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/img01-modulus-operation-bash-script.thumb.jpg.95feccbbc1b5b76a629e9d564c12919c.jpg"> </a>
</p>

<h2 id="modulo">
	استخدام الأس وباقي القسمة
</h2>

<p>
	لننشئ سكربت اسمه <code>power.sh</code> يقبل وسيطين عدديين ليكونا مثلًا <code>a</code> و <code>b</code>، ويُظهر نتيجة <code>b</code> مرفوعًا للأُس <code>b</code> كما يلي:
</p>

<pre class="ipsCode">#!/bin/bash
a=$1
b=$2
result=$((a**b))
echo "$1^$2=$result"
</pre>

<p>
	إذًا فقد استخدمنا المعامل <code>**</code> لحساب نتيجة <code>a</code> مرفوعًا للأس <code>b</code>، لنجرب السكربت على أعداد مختلفة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_28" style=""><span class="pln">kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">power</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">2</span><span class="pln"> </span><span class="lit">3</span><span class="pln">
</span><span class="lit">2</span><span class="pun">^</span><span class="lit">3</span><span class="pun">=</span><span class="lit">8</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">power</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">3</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="lit">3</span><span class="pun">^</span><span class="lit">2</span><span class="pun">=</span><span class="lit">9</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">power</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">5</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="lit">5</span><span class="pun">^</span><span class="lit">2</span><span class="pun">=</span><span class="lit">25</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">power</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">4</span><span class="pln"> </span><span class="lit">2</span><span class="pln">
</span><span class="lit">4</span><span class="pun">^</span><span class="lit">2</span><span class="pun">=</span><span class="lit">16</span></pre>

<p>
	سنتعلم الآن استخدام المعامل <code>%</code> أي باقي القسمة modulo، يرجع هذا المعامل باقي القسمة فقط ويكون عددًا صحيحًا، فالمتغير <code>rem</code> في المثال التالي سيحمل القيمة 2:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_30" style=""><span class="pln">rem</span><span class="pun">=</span><span class="pln">$</span><span class="pun">((</span><span class="lit">17</span><span class="pun">%</span><span class="lit">5</span><span class="pun">))</span></pre>

<p>
	الباقي هنا هو 2 لأننا نحصل على 17 بمضاعفة العدد 5 ثلاث مرات وإضافة 2 للنتيجة.
</p>

<h2 id="-2">
	إنشاء محول مقاييس لدرجات الحرارة باستخدام باش
</h2>

<p>
	لنطبق مثالًا شاملًا يستخدم كل العمليات الحسابية التي تعلمناها في الفقرات السابقة، سنكتب سكربت جديد باسم <code>c2f.sh</code> يحول درجة الحرارة من درجة مئوية إلى فهرنهايت وفق المعادلة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_32" style=""><span class="pln">F </span><span class="pun">=</span><span class="pln"> C x </span><span class="pun">(</span><span class="lit">9</span><span class="pun">/</span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">32</span></pre>

<p>
	الطريقة المستخدمة هنا هي إحدى الطرق المتبعة لكتابة هذا السكربت، مع العلم أنه توجد طرق أخرى تعطيك النتيجة نفسها، سنعرف بداية المتغيرات فالمتغير<code>C</code>يمثل درجة الحرارة المئوية، والمتغير<code>F</code>يمثل درجة الحرارة بالفهرنهايت.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_34" style=""><span class="com">#!/bin/bash</span><span class="pln">

C</span><span class="pun">=</span><span class="pln">$1
F</span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="pln">echo </span><span class="str">"scale=2; $C * (9/5) + 32"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> bc </span><span class="pun">-</span><span class="pln">l</span><span class="pun">)</span><span class="pln">

echo </span><span class="str">"$C degrees Celsius is equal to $F degrees Fahrenheit."</span></pre>

<p>
	استخدمنا الأمر <code>bc</code> هنا لأننا نتعامل مع أعداد عشرية، والأمر <code>scale=2</code> لإظهار خانتين فقط بعد الفاصلة العشرية.
</p>

<p>
	لنجري بعض الآن التحويلات باستخدام السكربت التالي الذي يقرأ درجة الحرارة المدخلة بالدرجة المئوية، وتحويلها إلى الفهرنهايت، ثم عرض النتيجة لكل قيمة مدخلة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6783_36" style=""><span class="pln">kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">c2f</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">2</span><span class="pln">
</span><span class="lit">2</span><span class="pln"> degrees </span><span class="typ">Celsius</span><span class="pln"> is equal to </span><span class="lit">35.60</span><span class="pln"> degrees </span><span class="typ">Fahrenheit</span><span class="pun">.</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">c2f</span><span class="pun">.</span><span class="pln">sh </span><span class="pun">-</span><span class="lit">3</span><span class="pln">
</span><span class="pun">-</span><span class="lit">3</span><span class="pln"> degrees </span><span class="typ">Celsius</span><span class="pln"> is equal to </span><span class="lit">26.60</span><span class="pln"> degrees </span><span class="typ">Fahrenheit</span><span class="pun">.</span><span class="pln">
kabary@handbook</span><span class="pun">:~/</span><span class="pln">scripts$ </span><span class="pun">./</span><span class="pln">c2f</span><span class="pun">.</span><span class="pln">sh </span><span class="lit">27</span><span class="pln">
</span><span class="lit">27</span><span class="pln"> degrees </span><span class="typ">Celsius</span><span class="pln"> is equal to </span><span class="lit">80.60</span><span class="pln"> degrees </span><span class="typ">Fahrenheit</span><span class="pun">.</span></pre>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	إلى هنا نكون قد انتهينا من مقالنا الذي شرحنا فيه العمليات الحسابية الأساسية في سكربتات باش مع التطبيق العملي، نرجو أن يكون المقال قد قدم الفائدة المرجوة، وندعوك لمطالعة مقالنا التالي حول <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/" rel="">التعامل مع السلاسل النصية Strings في باش</a>.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-arithmetic-operators/" rel="external nofollow">Using Arithmetic Operators in Bash Scripting</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/" rel="">استخدام المصفوفات في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%82%D8%B1%D8%A7%D8%A1%D8%A9-%D9%88%D8%B6%D8%A8%D8%B7-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-%D9%88%D8%A7%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r697/" rel="">قراءة وضبط متغيرات الصدفة Shell والبيئة في لينكس</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/shell_expansion" rel="external">التوسعات في باش</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Bash/advantages_of_the_Bash" rel="external">ميزات صدفة باش</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">828</guid><pubDate>Sat, 07 Dec 2024 15:07:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_11/----Bash.jpg.cfef9f8939190514e0b200c77d7bdb01.jpg" /></p>
<p>
	قد تحتاج في  سكريتات باش للتعامل مع مئات المتغيرات التي يدخلها المستخدم وفي هذه الحالة لن يكون من المناسب أن تنشئ هذه المتغيرات يدويًا، وهنا يأتي دور المصفوفات Arrays الحل المنقذ في مثل هذه الحالات، سنشرح في هذا المقال أساسيات التعامل مع المصفوفات في باش وتعديلها بكفاءة.
</p>

<h2 id="">
	أنشئ مصفوفتك الأولى في باش
</h2>

<p>
	لنفترض أنك تحتاج لكتابة سكربت بسيط لتحديث الطابع الزمني timestamp لخمس ملفات مختلفة، والطابع الزمنية هي مجموعة محارف وأرقام تدل على تاريخ ووقت إجراء تعديل معين على الملف.
</p>

<p>
	لننشئ السكربت timestamp.sh الخاص بهذه العملية أولًا بطريقة المتغيرات دون استخدام المصفوفات، فسيكون على الشكل التالي:
</p>

<pre class="ipsCode">#!/bin/bash

file1="f1.txt"
file2="f2.txt"
file3="f3.txt"
file4="f4.txt"
file5="f5.txt"

touch $file1
touch $file2
touch $file3
touch $file4
touch $file5
</pre>

<p>
	لننشئه الآن باستخدام المصفوفات ونلاحظ الفرق، سنخزن في المصفوفة أسماء الملفات الخمسة عوضًا عن تعريف خمس متغيرات تقابل أسماء الملفات الخمسة، وفيما يلي الصيغة العامة لتعريف المصفوفات في باش:
</p>

<pre class="ipsCode">array_name=(value1 value2 value3 … )
</pre>

<p>
	لنطبق الصيغة على حالتنا، فستكون مصفوفة أسماء الملفات وفق التالي:
</p>

<pre class="ipsCode">files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
</pre>

<p>
	السكربت الآن أوضح وأكثر كفاءة وأقرب لمعايير الكود النظيف، فقد استبدلنا خمسة متغيرات بمصفوفة واحدة فقط.
</p>

<h2 id="-1">
	الوصول لعناصر مصفوفات باش
</h2>

<p>
	تبدأ فهرسة مصفوفات باش بالصفر <code>0</code> ويستخدم الدليل <code>n-1</code> للوصول إلى العنصر <code>n</code> من المصفوفة.
</p>

<p>
	فإذا رغبنا بإظهار العنصر الثاني في المصفوفة فسنكتب التالي:
</p>

<pre class="ipsCode">echo ${files[1]}
</pre>

<p>
	وللوصول للعنصر الثالث:
</p>

<pre class="ipsCode">echo ${files[2]}
</pre>

<p>
	وهكذا لبقية العناصر.
</p>

<p>
	لنجرب أمرًا آخر، ألقِ نظرة على السكربت التالي reverse.sh الذي سيظهر كامل عناصر مصفوفتك بترتيب عكسي من العنصر الأخير إلى الأول:
</p>

<pre class="ipsCode">#!/bin/bash

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

echo ${files[4]}
echo ${files[3]}
echo ${files[2]}
echo ${files[1]}
echo ${files[0]}
</pre>

<p>
	وستحصل بتنفيذه على الخرج التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="162681" href="https://academy.hsoub.com/uploads/monthly_2024_11/img01-arrays-in-bash-scripts.png.b9601d63cc6a3ca6c77457b65a58838a.png" rel=""><img alt="img01 arrays in bash scripts" class="ipsImage ipsImage_thumbnailed" data-fileid="162681" data-unique="r16nld19c" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_11/img01-arrays-in-bash-scripts.thumb.png.fa48105074349e1314914e8c5a10eed5.png"> </a>
</p>

<p>
	سنتعلم لاحقًا كيف نظهر عناصر المصفوفة باستخدام الحلقات Loops، فتكرار الأمر <code>echo</code> للغرض نفسه عددً كبيرًا من المرات ليس الطريقة الأفضل لإظهار عناصر المصفوفة.
</p>

<p>
	يمكننا أيضًا إظهار عناصر المصفوفة دفعة واحدة في سطرٍ واحد كما في الأمر التالي:
</p>

<pre class="ipsCode">echo ${files[*]}

f1.txt f2.txt f3.txt f4.txt f5.txt
</pre>

<p>
	ويساعدك الأمر التالي على إظهار عدد عناصر المصفوفة الذي يسمى اصطلاحًا حجم المصفوفة size of array:
</p>

<pre class="ipsCode">echo ${#files[@]}

5
</pre>

<p>
	وبوسعك تغيير قيمة أي عنصر من عناصر المصفوفة بسهولة، ألقِ نظرة على السطر أدناه إذ نغير فيه قيمة العنصر الأول إلى القيمة "a.txt":
</p>

<pre class="ipsCode">files[0]="a.txt"
</pre>

<h2 id="-2">
	إضافة عناصر جديدة إلى مصفوفة باش
</h2>

<p>
	لننشئ مثلًا المصفوفة التالية التي تتضمن أسماء <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B1%D8%B6-%D9%85%D9%88%D8%AC%D8%B2-%D9%84%D8%A3%D8%B4%D9%87%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r631/" rel="">أشهر توزيعات لينكس</a>:
</p>

<pre class="ipsCode">distros=("Ubuntu" "Red Hat" "Fedora")
</pre>

<p>
	تحتوي المصفوفة الحالية على ثلاثة عناصر، ويمكنك إضافة عناصر أخرى إلى نهايتها باستخدام المعامل <code>=+</code>، دعنا نضيف مثلًا توزيعة Kali بكتابة:
</p>

<pre class="ipsCode">distros+=("Kali")
</pre>

<p>
	تحتوي المصفوفة الآن أربعة عناصر، وتبين الصورة أدناه السكربت بعد إضافة العنصر الأخير:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="162682" href="https://academy.hsoub.com/uploads/monthly_2024_11/img02-add-element-to-arrays.jpg.a827651d8be7f048dc6e27ba10d43cd8.jpg" rel=""><img alt="img02 add element to arrays" class="ipsImage ipsImage_thumbnailed" data-fileid="162682" data-unique="q04u6cd4q" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_11/img02-add-element-to-arrays.thumb.jpg.76aa8b21ac4f6e4456d05a7f85895ae8.jpg"> </a>
</p>

<h2 id="-3">
	حذف عناصر من مصفوفة باش
</h2>

<p>
	لننشئ مصفوفة تتضمن الأعداد من 1 إلى 5:
</p>

<pre class="ipsCode">num=(1 2 3 4 5)
</pre>

<p>
	يمكنك إظهار كافة عناصر المصفوفة كما يلي:
</p>

<pre class="ipsCode">echo ${num[*]}

1 2 3 4 5
</pre>

<p>
	لنفترض أننا نرغب بحذف العنصر الثالث منها، فسنستخدم الأمر <code>unset</code> وفق التالي:
</p>

<pre class="ipsCode">unset num[2]
</pre>

<p>
	أظهر الآن كافة عناصر المصفوفة كما يلي:
</p>

<pre class="ipsCode">echo ${num[*]}
1 2 4 5
</pre>

<p>
	ولاحظ حذف العنصر الثالث.
</p>

<p>
	يمكنك أيضًا حذف المصفوفة بالطريقة نفسها بكتابة الأمر أدناه:
</p>

<pre class="ipsCode">unset num
</pre>

<p>
	تبين الصورة أدناه تنفيذ سكربت يتضمن كل ما تعلمناه في هذه الفقرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="162683" href="https://academy.hsoub.com/uploads/monthly_2024_11/img03-delete-arrays-in-bash-scripts.jpg.bc15766c976277166237e4becaf94528.jpg" rel=""><img alt="img03 delete arrays in bash scripts" class="ipsImage ipsImage_thumbnailed" data-fileid="162683" data-unique="5x5q8an46" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_11/img03-delete-arrays-in-bash-scripts.thumb.jpg.a022330059300c8bfa1674555c301d0f.jpg"> </a>
</p>

<h2 id="-4">
	إنشاء مصفوفة هجينة بأنواع مختلفة من البيانات
</h2>

<p>
	تتميز باش عن الكثير من لغات البرمجة بقدرتها على إنشاء مصفوفات هجينة hybrid arrays تحتوي أنواعًا مختلفة من البيانات، مثلًا أعداد صحيحة وسلاسل نصية وغيرها كما في سكربت باش التالي باسم user.sh:
</p>

<pre class="ipsCode">#!/bin/bash

user=("john" 122 "sudo,developers" "bash")

echo "User Name: ${user[0]}"
echo "User ID: ${user[1]}"
echo "User Groups: ${user[2]}"
echo "User Shell: ${user[3]}"
</pre>

<p>
	لاحظ أن مصفوفة المستخدمين السابقة تتضمن أربع عناصر هي:
</p>

<ol>
	<li>
		 العنصر "john" نوعه سلسلة نصية String
	</li>
	<li>
		 العنصر 122 نوعه عدد صحيح Integer
	</li>
	<li>
		العنصر "sudo,developers" نوعه سلسلة نصية String
	</li>
	<li>
		العنصر "bash" نوعه سلسلة نصية String
	</li>
</ol>

<p>
	سيكون خرج السكربت على النحو التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="162684" href="https://academy.hsoub.com/uploads/monthly_2024_11/img04-hybrid-arrays-in-bash-scripts.jpg.98f742fa3025f02514c52d4f88859d52.jpg" rel=""><img alt="img04 hybrid arrays in bash scripts" class="ipsImage ipsImage_thumbnailed" data-fileid="162684" data-unique="fbghkz88b" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_11/img04-hybrid-arrays-in-bash-scripts.thumb.jpg.9eb5ae7c7f2cf39ebfc98b753659c371.jpg"> </a>
</p>

<h2 id="-5">
	الخلاصة
</h2>

<p>
	نصل بذلك لنهاية مقال المصفوفات في لغة باش Bash الذي تعرفنا فيه على المصفوفات والوصول لعناصرها وعكس ترتيبها وتعديلها وإضافة وحذف عناصرها، كما تعرفنا على طريقة إلى إنشاء مصفوفات هجينة تحتوي على أنواع بيانات مختلفة، تابع المقال التالي حيث سنتعرف فيه على طريقة <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/" rel="">التعامل مع المعاملات الحسابية</a> بكفاءة ضمن سكربتات باش Bash.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-arrays/" rel="external nofollow">Using Arrays in Bash</a>.
</p>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/" rel="">تمرير الوسطاء إلى سكربت باش Bash</a>
	</li>
	<li>
		 <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/" rel="">طريقة التعامل مع المتغيرات وتمرير الوسطاء لسكربت باش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">مدخل إلى صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D9%88%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r266/" rel="">الحصول على مدخلات من لوحة المفاتيح وإجراء العمليات الحسابية في سكربتات الصدفة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D8%AD%D8%AF%D8%AB-%D8%B9%D9%86%D8%AF-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r262/" rel="">الأخطاء الشائعة التي تحدث عند كتابة سكربتات الصدفة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">827</guid><pubDate>Sat, 23 Nov 2024 15:00:00 +0000</pubDate></item><item><title>&#x62A;&#x645;&#x631;&#x64A;&#x631; &#x627;&#x644;&#x648;&#x633;&#x637;&#x627;&#x621; &#x625;&#x644;&#x649; &#x633;&#x643;&#x631;&#x628;&#x62A; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_11/-----Bash.jpg.d234eaf37d01870d866cbd063502a26e.jpg" /></p>
<p>
	يعرض المقال الثالث من <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">سلسلة باش</a> كيفية تمرير الوسطاء arguments إلى سكربتات الصدفة باش، وإضافةً للوسطاء سنتعرف على بعض المتغيرات الخاصة في صدفة باش.
</p>

<p>
	تعلمنا في <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">المقال السابق</a> كيف نستخدم المتغيرات لكتابة سكربتات باش عامة وديناميكية تتجاوب مع أنواع مختلفة من البيانات ومدخلات المستخدم، وسنتعلم هنا تمرير الوسطاء إلى سكربتات باش ضمن سطر الأوامر.
</p>

<h2 id="">
	تمرير وسيط إلى سكربت باش
</h2>

<p>
	يحتسب السكربت <code>count_lines.sh</code> التالي عدد الأسطر الموجودة في أي ملف تزوده باسمه:
</p>

<pre class="ipsCode">#!/bin/bash

echo -n "Please enter a filename: "
read filename
nlines=$(wc -l &lt; $filename)

echo "There are $nlines lines in $filename"
</pre>

<p>
	يمكنك الرجوع <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/" rel="">للمقال الأول</a> لتعرف كيف تُنشئ سكربت باش وتحوله لملف تنفيذي.
</p>

<p>
	لنفترض أننا نود حساب عدد الأسطر الموجودة في الملف <code>etc/passwd/</code> فستكون نتيجة تنفيذ السكربت كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="162057" href="https://academy.hsoub.com/uploads/monthly_2024_11/img01-bash-arguments.png.bfcf8d9a410190814d1385fb2c34e24e.png" rel=""><img alt="img01 bash arguments" class="ipsImage ipsImage_thumbnailed" data-fileid="162057" data-unique="5u552sgkj" src="https://academy.hsoub.com/uploads/monthly_2024_11/img01-bash-arguments.thumb.png.e680577de5030ff533fe8fc26629368b.png"> </a>
</p>

<p>
	يمكننا تسهيل العملية بتمرير اسم الملف للسكربت بصفته وسيط سطر أوامر يكتب معه في نافذة سطر الأوامر عند التشغيل كما يلي:
</p>

<pre class="ipsCode">./count_lines.sh /etc/passwd
</pre>

<p>
	يتطلب ذلك تعديلًا على السكربت نستخدم فيه المتغير <code>1$</code> الذي يشير إلى الوسيط الأول الذي سيتلقاه السكربت من سطر الأوامر (والذي يسمى المُحَدِّد الموضعي).
</p>

<p>
	لنستبدل إذًا المتغير <code>filename</code> الخاص باسم الملف بالمتغير <code>1$</code> في كامل السكربت <code>count_lines.sh</code> السابق، ليصبح كما يلي:
</p>

<pre class="ipsCode">#!/bin/bash

nlines=$(wc -l &lt; $1)
echo "There are $nlines lines in $1"
</pre>

<p>
	استغنينا بهذه الطريقة عن الأمر <code>read</code> والأمر <code>echo</code> الأول، فأصبح السكربت أقصر.
</p>

<p>
	يمكنك الآن تجربة السكربت على ملفات أخرى كما في المثال التالي:
</p>

<pre class="ipsCode">./count_lines.sh    /etc/group
There are 73 lines in /etc/group
</pre>

<h2 id="-1">
	تمرير عدة وسطاء إلى سكربت باش
</h2>

<p>
	يمكنك تمرير أكثر من وسيط لسكربتات باش، وفق الصيغة التالية:
</p>

<pre class="ipsCode">script.sh arg1 arg2 arg3  …
</pre>

<p>
	يشير المتغير <code>2$</code> للوسيط الثاني، والمتغير <code>3$</code> للوسيط الثالث وهكذا.
</p>

<p>
	أما المتغير <code>0$</code> فيشير إلى اسم السكربت، وهو أحد المتغيرات الخاصة في صدفة باش.
</p>

<p>
	لنُعدّل الآن السكربت السابق كما يلي ليقبل أكثر من ملف، ويحسب عدد الأسطر في كل واحد منها:
</p>

<pre class="ipsCode">#!/bin/bash

n1=$(wc -l &lt; $1)
n2=$(wc -l &lt; $2)
n3=$(wc -l &lt; $3)

echo "There are $n1 lines in $1"
echo "There are $n2 lines in $2"
echo "There are $n3 lines in $3"
</pre>

<p>
	يمكنك الآن تشغيل السكربت، وتمرير ثلاثة ملفات نصية له، لتحصل على أعداد الأسطر فيها كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="162058" href="https://academy.hsoub.com/uploads/monthly_2024_11/img02-bash-multiple-arguments.png.9c3a41dc2baac2b55327d5aa100c5415.png" rel=""><img alt="img02 bash multiple arguments" class="ipsImage ipsImage_thumbnailed" data-fileid="162058" data-unique="l6cgw0v87" src="https://academy.hsoub.com/uploads/monthly_2024_11/img02-bash-multiple-arguments.thumb.png.763298e44cac8cc7fd235bff3eb2fb76.png"> </a>
</p>

<p>
	إذا فقد أعطانا السكربت عدد الأسطر في كل ملف من الملفات الثلاثة، وبالترتيب نفسه المكتوبة به، فترتيب تمرير الوسطاء للسكربت مهم لضمان دقة التنفيذ.
</p>

<h2 id="-2">
	أبدِع في استخدام وسطاء باش
</h2>

<p>
	يساعدك استخدام وسطاء باش على تبسيط أوامر <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a> الطويلة أو المعقدة التي تحتاج لضبط الكثير من الخيارات، إذ يمكنك تحويلها لسكربتات باش بسيطة، وتشغيلها بعد تزويدها بالوسطاء.
</p>

<p>
	ألقِ نظرة على سكربت باش <code>find.sh</code> التالي لتوضيح الأمر:
</p>

<pre class="ipsCode">#!/bin/bash

find / -iname $1 2&gt; /dev/null
</pre>

<p>
	يساعدك هذا السكربت في العثور على الملفات، وستجد استخدامه أسهل من كتابة أمر البحث الطويل في كل مرة تحتاج فيها لإيجاد ملف، فقط مرر اسم الملف الذي تبحث عنه بصفته وسيطًا للسكربت وسيعرض لك موقعه.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="487" id="ips_uid_2096_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="البحث عن الملفات في Linux" width="866" data-embed-src="https://www.youtube.com/embed/EGQaHN60XKc"></iframe>
</p>

<p>
	وبالطريقة نفسها يمكنك تحويل أي أمر طويل ومعقد من أوامر لينكس إلى سكربت باش سهل الاستخدام.
</p>

<p>
	أما التعليمة: <code>‏‎</code>2&gt; /dev/null الواردة في السكربت فتحجب رسائل الخطأ مثل (لا يمكن الوصول للملف أو غيرها) من الظهور على الشاشة.
</p>

<h2 id="-3">
	أشهر المتغيرات الخاصة في باش
</h2>

<p>
	توفر لك صدفة باش مجموعة من <a href="https://wiki.hsoub.com/Bash/variables#.D8.A7.D9.84.D9.85.D8.B9.D8.A7.D9.85.D9.90.D9.84.D8.A7.D8.AA_.D8.A7.D9.84.D8.AE.D8.A7.D8.B5.D8.A9" rel="external">المتغيرات الخاصة</a> المُضمنة فيها، وتُعدّ مفيدة جدًا في أي سكربت.
</p>

<p>
	يتضمن الجدول أشهرها:
</p>

<table>
	<thead>
		<tr>
			<th>
				المتغير الخاص
			</th>
			<th>
				الوصف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				$0
			</td>
			<td>
				اسم السكربت
			</td>
		</tr>
		<tr>
			<td>
				$1, $2…$n
			</td>
			<td>
				وسطاء سطر الأوامر
			</td>
		</tr>
		<tr>
			<td>
				$$
			</td>
			<td>
				مُعرّف العملية process id للصدفة shell الحالية
			</td>
		</tr>
		<tr>
			<td>
				#$
			</td>
			<td>
				العدد الكلي للوسطاء المُمَرَّة إلى السكربت
			</td>
		</tr>
		<tr>
			<td>
				@$
			</td>
			<td>
				قيم جميع الوسطاء المُمَرَّة إلى السكربت
			</td>
		</tr>
		<tr>
			<td>
				?$
			</td>
			<td>
				حالة الخروج لآخر أمر مُنَفذ
			</td>
		</tr>
		<tr>
			<td>
				!$
			</td>
			<td>
				مُعرّف العملية لآخر أمر مُنَفذ
			</td>
		</tr>
	</tbody>
</table>

<p>
	يعطيك السكربت <code>Variables.sh</code> التالي مثالًا عمليًّا بسيطًا عن المتغيرات الخاصة:
</p>

<pre class="ipsCode">#!/bin/bash

echo "Name of the script: $0"
echo "Total number of arguments: $#"
echo "Values of all the arguments: $@"
</pre>

<p>
	مرر عدد من الوسطاء التجريبية، ثم شغل السكربت، ولاحظ النتائج:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="162059" href="https://academy.hsoub.com/uploads/monthly_2024_11/img03-special-bash-variables.png.b2212ef5d2a38c5c336e465d63b52e54.png" rel=""><img alt="img03 special bash variables" class="ipsImage ipsImage_thumbnailed" data-fileid="162059" data-unique="y7dy0b71a" src="https://academy.hsoub.com/uploads/monthly_2024_11/img03-special-bash-variables.thumb.png.aeef2ddd7ca7d5d302c0f57c549dde88.png"> </a>
</p>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-arguments/" rel="external nofollow">Passing Arguments to Bash Scripts</a> لصاحبه Kabary.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">المتغيرات في سكربتات الصدفة باش</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-descriptors-%D9%88%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D9%87%D8%A7-%D8%A8%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%AC%D8%B1%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-r1657/" rel="">مفهوم واصفات الملفات File Descriptors وارتباطها بعملية التجريد في أنظمة التشغيل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/" rel="">أنشئ برنامجك النصي الأول على صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%AD%D8%AA%D8%B1%D9%81-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-ls-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r558/" rel="">احترف الأمر ls في لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">825</guid><pubDate>Wed, 13 Nov 2024 15:02:05 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A; &#x641;&#x64A; &#x633;&#x643;&#x631;&#x628;&#x62A;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_11/-----Bash.jpg.75c843fa7e8710f06afc8f426eff1e50.jpg" /></p>
<p>
	المتغيرات Variables جزءٌ أساسي من أي مشروع برمجي، لا بدّ أنك تعاملت معها من قبل، وإن كنت لا تملك معرفةً مسبقة بها، فيمكنك تشبيهها بحاويات التخزين فهي تُخَزِّن أجزاءً من المعلومات قد تتغير قيمها مع الزمن.
</p>

<p>
	ويتناول مقالنا الثاني من سلسلة <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">باش Bash للمبتدئين</a> طريقة استخدام المتغيرات في كتابة سكربتات الصدفة باش bash shell scripts، تابع معنا أمثلة المقال لتتعلم استعمال المتغيرات لكتابة سكربتات باش.
</p>

<h2 id="">
	استخدام المتغيرات في سكربتات الصدفة باش
</h2>

<p>
	تعلمنا في <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/" rel="">المقال السابق</a> كيفية إنشاء سكربت باش بسيط يعرض عبارة " hello world"، اسمه "hello.sh" ويتضمن المحتوى التالي:
</p>

<pre class="ipsCode">#! /bin/bash

echo 'Hello, World!'
</pre>

<p>
	لنحاول تطوير هذا السكربت البسيط ليتظهر اسم المستخدم في عبارة الترحيب، سنستخدم لذلك المتغيرات والأمر <code>read</code> القادر على استلام المدخلات من المستخدمين، يمكنك مطالعة <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D9%88%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r266/" rel="">هذا المقال</a> للحصول على معلومات أكثر عن <code>read</code>، والآن افتح الملف "hello.sh" وعدّل محتواه ليصبح كما يلي:
</p>

<pre class="ipsCode">#! /bin/bash

echo "What's your name, stranger?"

read name

echo "Hello, $name"
</pre>

<p>
	إذا شغلت السكربت سيُطالبك بإدخال اسمك ثم سيرحب بك بالاسم الذي زودته به، وفق التالي:
</p>

<pre class="ipsCode">abhishek@handbook:~/scripts$ ./hello.sh 
What's your name, stranger?
Elliot
Hello, Elliot
</pre>

<p>
	إذًا سيسألك البرنامج عن اسمك، ثم تزوده به، وبعدها سيظهر اسمك في عبارة الترحيب.
</p>

<p>
	وهذا ملخص لما نفذناه حتى الآن:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="161633" href="https://academy.hsoub.com/uploads/monthly_2024_11/img01-variables-in-shell-script.jpg.8bc4f8cab0ffe8d8074fc254cbc18715.jpg" rel=""><img alt="img01 variables in shell script" class="ipsImage ipsImage_thumbnailed" data-fileid="161633" data-unique="v3ao7po7b" src="https://academy.hsoub.com/uploads/monthly_2024_11/img01-variables-in-shell-script.jpg.8bc4f8cab0ffe8d8074fc254cbc18715.jpg"> </a>
</p>

<h2 id="-1">
	الشرح التفصيلي للسكربت السابق
</h2>

<p>
	لنراجع نص السكربت سطرًا سطرًا مع توضيح دلالة كل سطر.
</p>

<p>
	يتضمن السطر الأول رمز التوجيه shebang ليوضح لمُفسر الأوامر أننا سنستخدم الصدفة باش لتنفيذ السكربت.
</p>

<pre class="ipsCode">#!/bin/bash
</pre>

<p>
	وفي السطر الثاني أظهرنا العبارة التالية التي تطلب من المستخدم إدخال اسمه:
</p>

<pre class="ipsCode">echo "What's your name, stranger?"
</pre>

<p>
	ونفذنا ذلك باستخدام أمر بسيط هو <code>echo</code> الذي يعرض العبارة المكتوبة بعده على شاشة الطرفية.
</p>

<p>
	ثم السطر الثالث، وهو الجزء الأهم الذي أحدث تطورًا في السكربت:
</p>

<pre class="ipsCode">read name
</pre>

<p>
	استخدمنا فيه الأمر <code>read</code> لنقل التحكم من السكربت إلى المستخدم ليستطيع إدخال اسمه وتخزينه في متغير يدعى <code>name</code>.
</p>

<p>
	وفي السطر الأخير يستخدم السكربت المتغير <code>name</code> ويرحب بالمستخدم باسمه:
</p>

<pre class="ipsCode">echo “Hello, $name”
</pre>

<p>
	تُكتب إشارة "$" قبل اسم المتغير للحصول على القيمة المخزنة فيه، أو لو كتبت <code>name</code> فقط في السطر السابق بدلًا من <code>name$</code> فتظهر العبارة "Hello, name" عوضًا عن الترحيب بالمستخدم باسمه (الذي هو قيمة المتغير).
</p>

<p>
	<strong><em>ملاحظة</em></strong>: تعرف إشارة "$" في سكربتات باش بأنها معامل تحصيل dereference operator لتحصيل قيمة معينة من موقعها في الذاكرة.
</p>

<h2 id="-2">
	إنشاء متغيرات بأنواع بيانات مختلفة
</h2>

<p>
	يمكن إنشاءمتغيرات بأنواع بيانات مختلفة مثل الأعداد والمحارف والسلاسل النصية، وتستخدم إشارة المساواة "=" لإنشاء المتغيرات وإسناد القيم الافتراضية لها، ففي السطر التالي مثلًا أنشأنا متغيرًا يدعى <code>age</code> وأسندنا له القيمة 27.
</p>

<pre class="ipsCode">age=27
</pre>

<p>
	يمكنك تغيير قيمة المتغير لاحقًا بقدر ما تريد، فالسطر التالي مثلًا يغيرها من 27 إلى 3:
</p>

<pre class="ipsCode">age=3
</pre>

<p>
	تحمل المتغيرات أنواعًا مختلفة من البيانات، مثل الأعداد الصحيحة، والمحارف، والسلاسل النصية،  وباش لا تحدد الأنواع بشكل صارم كما في بعض لغات البرمجة الأخرى، فلا حاجة لتحديد نوع المتغير مسبقًا ويمكنك وضع أي نوع ضمن المتغير. ألقِ نظرة على الأمثلة التالية:
</p>

<pre class="ipsCode">letter=’c’
color=’blue’
year=2020
</pre>

<h2 id="-3">
	المتغيرات الثابتة في سكربت باش
</h2>

<p>
	المتغير الثابت constant variable هو متغير ذو قيمة ثابتة لا تتغير أبدًا، تُنشِئه بواسطة الأمر <code>readonly</code> كما يلي:
</p>

<pre class="ipsCode">readonly PI=3.14159
</pre>

<p>
	أنشأ الأمر السابق متغيرًا ثابتًا يدعى <code>PI</code> يحمل القيمة 3.14159، وإذا حاولت تغيير قيمته فلن تتمكن من ذلك وستحصل على الخطأ التالي:
</p>

<pre class="ipsCode">bash: PI: readonly variable
</pre>

<p>
	إذًا المتغيرات الثابتة هي متغيرات للقراءة فقط، يمكنك قراءة قيمتها فقط، ولا تستطيع تغييرها أبدًا بعد إنشائها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="161634" href="https://academy.hsoub.com/uploads/monthly_2024_11/img02-constant-varaible-in-bash-shell-script.jpg.f7dac5e8b3e7379a22d8d86b2cf3c8f0.jpg" rel=""><img alt="img02 constant varaible in bash shell script" class="ipsImage ipsImage_thumbnailed" data-fileid="161634" data-unique="m9njnxvcn" src="https://academy.hsoub.com/uploads/monthly_2024_11/img02-constant-varaible-in-bash-shell-script.jpg.f7dac5e8b3e7379a22d8d86b2cf3c8f0.jpg"> </a>
</p>

<h2 id="commandsubstitutions">
	تعويض الأوامر Command substitutions
</h2>

<p>
	تعويض الأوامر Command substitutions هو تخزين نتيجة أمر في متغير، ويُعدّ من أبرز مميزات البرمجة النصية باستخدام صدفة باش.
</p>

<p>
	والأمر <code>date</code> الخاص بإظهار التاريخ الحالي من أشهر الأمثلة على <a href="https://linuxhandbook.com/bash-command-substitution/" rel="external nofollow">تعويض الأوامر</a>، ألقِ نظرة على السطر التالي:
</p>

<pre class="ipsCode">TODAY=$(date)
</pre>

<p>
	حسب السطر السابق يُخَزَّن خرج الأمر <code>date</code> في المتغير <code>TODAY</code>، ولاحظ أن الأمر المستخدم لتعويض الأوامر يُكتب بين قوسين هلاليين ويُسبَق بإشارة الدولار "$" على يساره.
</p>

<p>
	تبين الصورة أدناه كيف أخذ المتغير <code>TODAY</code> قيمة خرج الأمر <code>date</code>:
</p>

<p style="text-align: center;">
	<img alt="img03-command-substitution-bash-shell" class="ipsImage ipsImage_thumbnailed" data-fileid="161635" data-ratio="25.98" data-unique="6v30hb8ia" style="width: 839px; height: auto;" width="839" src="https://academy.hsoub.com/uploads/monthly_2024_11/img03-command-substitution-bash-shell.jpg.398498ca3d39b1cb77330eaf087cc6b8.jpg">
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="" rel=""> </a>
</p>

<p>
	يمكنك أيضًا كتابة تعويض الأوامر بوضع الأمر بين علامتي اقتباس مائلة للخلف back quotes وفق التالي، بدلًا من وضعه بين قوسين مع إشارة الدولار:
</p>

<pre class="ipsCode">TODAY=`date`
</pre>

<p>
	لكننا ننصحك بعدم استخدام هذه الطريقة في كتابة تعويض الأوامر لأنها قديمة ولم تعد مستخدمة، احرص دائمًا على استخدام الطريقة الحديثة ذات الصيغة التالية:
</p>

<pre class="ipsCode">variable=$(command)
</pre>

<h2 id="-4">
	مثال عملي على تعويض الأوامر
</h2>

<p>
	في آخر تحديث أجريناه على السكربت "hello.sh" كنا نطلب من المستخدم إدخال اسمه ليستخدمه البرنامج في رسالة الترحيب.
</p>

<p>
	أما الآن -وبالاعتماد على تعويض الأوامر- لن نسأل المستخدم عن اسمه بل سنستعين بأمر خاص يدعى <code>whoami</code> يعطينا اسم المستخدم الحالي.
</p>

<p>
	عدّل محتوى الملف "hello.sh" ليصبح كما يلي:
</p>

<pre class="ipsCode">#! /bin/bash           

echo "Hello, $(whoami)"
</pre>

<p>
	لاحظ الاختصار الذي طرأ على حجم السكربت فقد أصبح يقتصر على سطرين فقط، شغّل السكربت الآن:
</p>

<pre class="ipsCode">./hello.sh
</pre>

<p>
	سيؤكد لك الخرج نجاح العملية، فسيظهر اسم المستخدم الحالي في رسالة الترحيب، وتلخص هذه الصورة ما طبقناه هنا:
</p>

<p>
	<img alt="img04-using-command-substitution-in-bash-shell-script" class="ipsImage ipsImage_thumbnailed" data-fileid="161636" data-ratio="30.56" data-unique="iye6tso7v" style="width: 841px; height: auto;" width="841" src="https://academy.hsoub.com/uploads/monthly_2024_11/img04-using-command-substitution-in-bash-shell-script.jpg.562765267434617306918c2c37c73a88.jpg">
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="" rel=""> </a>
</p>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/bash-variables/" rel="external nofollow">Understanding Variables in Bash Shell Scripting</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<span ipsnoautolink="true">المقال السابق: <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/" rel="">أنشئ برنامجك النصي الأول على صدفة باش Bash</a></span>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">مدخل إلى صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/" rel="">دليل ميَسَّر لكتابة سكربتات Shell</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D9%85%D9%86-%D9%84%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-%D9%88%D8%A5%D8%AC%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r266/" rel="">مدخل إلى كتابة سكربتات الصدفة الحصول على مدخلات من لوحة المفاتيح وإجراء العمليات الحسابية في سكربتات الصدفة (Shell Scripts)</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">824</guid><pubDate>Thu, 07 Nov 2024 15:00:01 +0000</pubDate></item><item><title>&#x623;&#x646;&#x634;&#x626; &#x628;&#x631;&#x646;&#x627;&#x645;&#x62C;&#x643; &#x627;&#x644;&#x646;&#x635;&#x64A; &#x627;&#x644;&#x623;&#x648;&#x644; &#x639;&#x644;&#x649; &#x635;&#x62F;&#x641;&#x629; &#x628;&#x627;&#x634; Bash</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D9%86%D8%B4%D8%A6-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC%D9%83-%D8%A7%D9%84%D9%86%D8%B5%D9%8A-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r823/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_10/-------Bash.jpg.f7ed885ff2cebff226d35dacfb4d4e4a.jpg" /></p>
<p>
	كتابة سكربتات باش Bash Scripting مهارة أساسية لا غنى عنها لكل مدير نظام ومهندس DevOps، فإذا كنت ترغب بتطوير مهاراتك في هذا المجال سواءً كنت مبتدئًا أو متمرسًا في نظام لينكس فإن هذه السلسلة التي تشرح Bash للمبتدئين ستلبي طلبك، بما تقدمه من أمثلة وتطبيقات عملية على أساسيات باش بدايةً من إنشاء السكريبت وحتى أتمتة تنفيذه على الخادم، وتتضمن <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">هذه السلسلة</a> المقالات التالية:
</p>

<ol>
	<li>
		<strong>أنشئ برنامجك النصي الأول على صدفة باش Bash</strong>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r824/" rel="">المتغيرات في سكربتات الصدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D9%85%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D8%B3%D8%B7%D8%A7%D8%A1-%D8%A5%D9%84%D9%89-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r825/" rel="">تمرير الوسطاء إلى سكريبت باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r827/" rel="">استخدام المصفوفات في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B3%D8%A7%D8%A8%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B4-bash-r828/" rel="">استخدام المعاملات الحسابية في سكربتات باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r829/" rel="">عمليات السلاسل النصية في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r830/" rel="">الجمل الشرطية في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r831/" rel="">الحلقات في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D9%81%D9%8A-%D8%A8%D8%A7%D8%B4-bash-r832/" rel="">استخدام الدوال في باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%A7%D8%B4-bash-r833/" rel="">أتمتة المهام باستخدام باش Bash</a>
	</li>
</ol>

<p>
	هذا هو المقال الأول في <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">هذه السلسلة</a>، إذ ستتعرف فيه على كيفية إنشاء سكريبت باش bash script يفيدك في أتمتة المهام الروتينية على الخادم، إذ كثيرًا ما نجد أنفسنا ننفذ المهام نفسها مرارًا وتكرارًا، بداية من النسخ الاحتياطي للمجلدات، وتنظيف الملفات المؤقتة، وحتى استنساخ cloning قواعد البيانات.
</p>

<p>
	سننشئ معًا سكريبت باش بسيط ونقوم بتشغيله، ونستعرض بعض الأساسيات التي ينبغي لك معرفتها عن <a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/" rel="">كتابة سكربتات الصدفة Shell</a> عمومًا.
</p>

<h2 id="shell">
	إنشاء سكريبت Shell وتشغيله
</h2>

<p>
	أنشئ في البداية مجلدًا جديدًا اسمه "scripts" سنُخَزِّن فيه جميع السكربتات التي سننشئها في أثناء تطبيق أمثلة المقال، ثم انتقل للعمل ضمنه، بكتابة التالي:
</p>

<pre class="ipsCode" id="ips_uid_1038_11">mkdir scripts
cd scripts</pre>

<p>
	أنشئ ضمن المجلد السابق ملفًا نصيًّا باسم hello.sh باستخدام الأمر <code>cat</code> وفق التالي، أو أنشئه بأي طريقة أخرى تفضلها:
</p>

<pre class="ipsCode">cat &gt; hello.sh
</pre>

<p>
	يمكنك الآن الكتابة ضمن الملف من<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel=""> الطرفية terminal</a> مباشرةً فاكتب السطر التالي:
</p>

<pre class="ipsCode">echo 'Hello, World!'
</pre>

<p>
	ثم اضغط على Ctrl+D لحفظ التغييرات على الملف، والخروج من الأمر <code>cat</code>.
</p>

<p>
	تستطيع الكتابة ضمن الملف بالطريقة التي تناسبك باستخدام محررات النصوص العاملة في الطرفية مثلًا وأبرزها <a href="https://academy.hsoub.com/tags/%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D9%85%D8%AD%D8%B1%D9%91%D8%B1%20vim/" rel="">Vim</a> و <a href="https://academy.hsoub.com/programming/workflow/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A5%D9%8A%D9%85%D8%A7%D9%83%D8%B3-emacs-r1761/" rel="">Emacs</a> و <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A%D9%85-vim-%D9%88%D9%86%D8%A7%D9%86%D9%88-nano-r1590/" rel="">Nano</a>، أو محررات النصوص ذات الواجهة الرسومية نحو Gedit إذا كنت تستخدم إحدى بيئات سطح المكتب لنظام لينكس.
</p>

<p>
	يعرض الأمر <code>echo</code> العبارة "Hello World" المكتوبة بعده على الشاشة، وهدفنا هنا تشغيل <code>echo</code> على أنه سكريبت shell بدلًا من تشغيله بالطريقة العادية أي بكتابته ضمن الطرفية.
</p>

<p>
	بعد إنشاء الملف "hello.sh" سنحوله إلى ملف تنفيذي باستخدام الأمر <code>chmod</code>، كما يلي:
</p>

<pre class="ipsCode">chmod u+x hello.sh
</pre>

<p>
	يمكنك معرفة المزيد عن <code>chmod</code> وغيره من أوامر لينكس الشهيرة بمطالعة المقال <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B1%D8%AC%D8%B9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B4%D9%87%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r615/" rel="">مرجع إلى أشهر أوامر لينكس</a>.
</p>

<p>
	والآن لنشغّل السكريبت بكتابة الأمر "bash" قبل اسم الملف "hello.sh"، وفق التالي:
</p>

<pre class="ipsCode">bash hello.sh
</pre>

<p>
	ستظهر العبارة <code>!Hello, World</code> أمامك على الشاشة مشيرةً لنجاح تنفيذ السكربت.
</p>

<p>
	ألقِ نظرة على الصورة أدناه فهي تتضمن ملخصًا للأوامر التي نفذناها حتى الآن.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="160253" href="https://academy.hsoub.com/uploads/monthly_2024_10/img01-bash-shell-script.png.050667e20da44df882c001dc24573064.png" rel=""><img alt="img01 bash shell script" class="ipsImage ipsImage_thumbnailed" data-fileid="160253" data-unique="ayjc5081m" src="https://academy.hsoub.com/uploads/monthly_2024_10/img01-bash-shell-script.png.050667e20da44df882c001dc24573064.png"> </a>
</p>

<h2>
	تحويل سكريبت Shell إلى سكريبت Bash
</h2>

<p>
	يخلط البعض بين shell و bash، وهما مرتبطان بالفعل، لكن Shell أعَمّ من باش. فكلمة باش Bash اختصار للعبارة الإنجليزية "Bourne-Again shell"، وهي واحدة من أشهر أنواع الصدفات Shells المتاحة في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r799/" rel="">لينكس</a>.
</p>

<p>
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="487" id="ips_uid_1544_6" src="https://academy.hsoub.com/applications/core/interface/index.html" title="ما هي Bash" width="866" data-embed-src="https://www.youtube.com/embed/4Ea_mFmKzi0"></iframe>
</p>

<p>
	أما الصدفة shell فهي مُفَسِّر interpreter لسطر الأوامر يستقبل الأوامر المدخلة من المستخدم ويُشغلها، وله عدة أنواع. فأنت إذًا تستخدم الصدفة shell في كل مرة تكتب فيها أوامر لينكس، وعندما تفتح الطرفية على حاسوبك فأنت فعليَّا تشغل الصدفة الافتراضية لنظام لينكس الذي تستعمله.
</p>

<p>
	وباش هو الصدفة الافتراضية لمعظم توزيعات لينكس، لذا يستخدم في معظم الأحيان مرادفًا للصدفة shell.
</p>

<p>
	يوجد تشابه كبير في قواعد كتابة السكربتات بين أنواع الصدفات المختلفة، ولكنها مع ذلك تتباين في بعض الأحيان، فعلى سبيل المثال تبدأ فهرسة المصفوفات من "1" في <a href="https://www.zsh.org/?ref=linuxhandbook.com" rel="external nofollow">صدفة Zsh</a> بينما تبدأ من "0" في صدفة باش، وبالتالي فأي سكريبت مكتوب لصدفة Zsh ويتضمن مصفوفات، لن يعمل بطريقة صحيحة في صدفة باش.
</p>

<p>
	وهنا يأتي دور شيبانج shebang وهو السطر الذي تبدأ به كل سكربتات باش، فهو يوضح للمُفَسِّر أن السكريبت مكتوب للصدفة باش وليس لغيرها.
</p>

<h2 id="shebang">
	السطر Shebang في بداية كل سكريبت
</h2>

<p>
	يُقصد بسطر shebang العبارة <code>bin/bash/ !#</code> التي تكتب في السطر الأول من كل سكريبت باش، ويدعوه البعض hashbang لأنه يبدأ بالمحرفين هاش "#" hash وبان "!" ban. لاحظ كيف سيبدو السكريبت الذي أنشأناه قبل قليل بعد إضافة هذا السطر:
</p>

<pre class="ipsCode">#! /bin/bash

echo 'Hello, World!'
</pre>

<p>
	إذًا يخبر السطر <code>bin/bash/ !#</code> نظام التشغيل بنوع الصدفة أو المُفَسِّر الذي تود أن تستخدمه لتشغيل السكربت، فبعد إضافة هذا السطر إلى ملفنا السابق "hello.sh" سيعمل مباشرة بواسطة باش دون الحاجة لكتابة كلمة "bash'' قبل اسم الملف عند استدعائه كما فعلنا سابقًا. انظر الصورة أدناه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="160254" href="https://academy.hsoub.com/uploads/monthly_2024_10/img02-bash-shell-script-with-shebang.png.3accbae3c98a437ff17c7fcc0357d6d0.png" rel=""><img alt="img02 bash shell script with shebang" class="ipsImage ipsImage_thumbnailed" data-fileid="160254" data-unique="n4xafxa2q" src="https://academy.hsoub.com/uploads/monthly_2024_10/img02-bash-shell-script-with-shebang.png.3accbae3c98a437ff17c7fcc0357d6d0.png"> </a>
</p>

<h2 id="path">
	تشغيل السكريبت من أي مجلد بإضافة مساره للمتغير PATH
</h2>

<p>
	إذا دققت في الصورة السابقة ستجد أننا استخدمنا البادئة <code>/.</code> قبل اسم السكريبت المُراد تشغيله للدلالة على مساره (فهو موجود في مجلد العمل الحالي)، وفي حال حذفت البادئة فستحصل على خطأ مثل التالي:
</p>

<pre class="ipsCode">abhishek@handbook:~/scripts$ hello.sh
hello.sh: command not found
</pre>

<p>
	فقد بَدَا اسم الملف للصدفة باش على أنه أمر برمجي يدعى <code>hello.sh</code>، وبدأ باش يبحث عن مساره بين المسارات المحددة في المتغير PATH، فمسارات حفظ جميع الأوامر التي تُشغلها الصدفات تخزن في هذا المتغير.
</p>

<p>
	يمكنك استعراض محتويات المتغير PATH باستخدام الأمر <code>echo</code> وفق ما يلي:
</p>

<pre class="ipsCode">echo $PATH
/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
</pre>

<p>
	تفصل النقطتان الرأسيتان ":" بين المسارات الموجودة ضمن PATH والتي تفحصها صدفات shell عند تنفيذ أي أمر.
</p>

<p>
	يمكنك تشغيل أوامر لينكس مثل: <code>echo</code> و <code>cat</code> وغيرها من أي مجلد على الخادم لأن أماكن وجود ملفاتها التنفيذية معروفة للنظام فهي مُخَزَّنِة ضمن مجلدات bin، وجميع مجلدات bin مذكورة في المتغير PATH كما رأينا في خرج التعليمة السابقة، والمسارات الموجودة في PATH هي الأماكن التي يبحث فيها النظام عن الملف التنفيذي لأي أمر تطلب تشغيله.
</p>

<p>
	خلاصة القول إذا أردت تشغيل سكريبت باش الخاص بك من أي مجلد في نظام التشغيل كما لو أنه أمرٌ أساسي من أوامر النظام فأضف مسار وجوده إلى المتغير PATH، وفق الخطوات التالية.
</p>

<p>
	أولًا حدد مسار حفظ السكريبت بدقة، يمكنك استخدام الأمر <code>pwd</code> إذا كان السكريبت موجود في مجلد عملك الحالي:
</p>

<pre class="ipsCode">pwd
</pre>

<p>
	بعد أن تحصل على المسار (وهو المجلد "scripts" في مثالنا)، استخدم الأمر <code>export</code> لإضافته إلى المتغير PATH كما يلي:
</p>

<pre class="ipsCode">export PATH=$PATH:/home/user/scripts
</pre>

<p>
	<strong>ملاحظة</strong>: بعد إضافة المجلد scripts إلى نهاية متغير PATH، فهذا يعني أن النظام سيبحث في المجلدات القياسية أولاً قبل أن يبحث في المجلد  scripts. إذا كان لديك نسخ من نفس البرنامج في عدة دلائل، فإن هذا الترتيب يضمن أن النسخة الموجودة في المجلدات القياسية، بمعنى سيفحص نظام التشغيل المجلدات التي تتواجد مساراتها في المتغير PATH بالترتيب، وبالتالي فهو يبحث أولًا في المجلدات القياسية لحفظ السكربتات، ثم يأتي إلى المجلدات المخصصة التي أضافها المستخدم.
</p>

<p>
	شغّل الآن السكريبت بكتابة اسمه مباشرةً في الطرفية مثل أي أمر من أوامر لينكس العادية ولاحظ النتيجة، وفق التالي:
</p>

<pre class="ipsCode">abhishek@handbook:~/scripts$ hello.sh
Hello, World!
</pre>

<p>
	وهذا ملخص للأوامر التي نفذناها هنا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="160255" href="https://academy.hsoub.com/uploads/monthly_2024_10/img03-add-shell-script-to-path.png.9ee9fa7a0f1e76aecb92b89add5538f9.png" rel=""><img alt="img03 add shell script to path" class="ipsImage ipsImage_thumbnailed" data-fileid="160255" data-unique="g8nuscgtn" src="https://academy.hsoub.com/uploads/monthly_2024_10/img03-add-shell-script-to-path.png.9ee9fa7a0f1e76aecb92b89add5538f9.png"> </a>
</p>

<p>
	تهانينا، لقد أنجزت السكريبت الأول لك في باش، تابع معنا بقية <a href="https://academy.hsoub.com/tags/bash%20scripting/" rel="">مقالات السلسلة</a> لنتعلم أكثر عن متغيرات الصدفة، ونجرب معًا أمثلة متنوعة أخرى عن باش bash وطريقة التعامل معها بكفاءة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://linuxhandbook.com/run-shell-script/" rel="external nofollow">Create and Run Your First Bash Shell Script</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">مدخل إلى صدفة باش Bash</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/" rel="">دليل ميَسَّر لكتابة سكربتات Shell</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D8%AD%D8%AF%D8%AB-%D8%B9%D9%86%D8%AF-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-r262/" rel="">الأخطاء الشائعة التي تحدث عند كتابة سكربتات الصدفة (Shell Scripts)</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-scripts-%D8%A7%D9%84%D9%85%D9%88%D8%AC%D9%88%D8%AF%D8%A9-%D8%B9%D9%84%D9%89-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%83-r254/" rel="">تعديل سكربتات الصدفة (Shell Scripts) الموجودة على حاسوبك</a>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">823</guid><pubDate>Wed, 23 Oct 2024 15:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x62E;&#x62A;&#x627;&#x631; &#x62A;&#x648;&#x632;&#x64A;&#x639;&#x629; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x627;&#x644;&#x645;&#x646;&#x627;&#x633;&#x628;&#x629; &#x644;&#x643;&#x61F;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%AE%D8%AA%D8%A7%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8%D8%A9-%D9%84%D9%83%D8%9F-r811/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_06/1908366820_.png.64348073d895d1f07024f5bab86749e9.png" /></p>
<p>
	إن تثبيت نظام التشغيل هو نقطة الانطلاق في إعداد أي خادم سحابي، وقد سيطرت نظم تشغيل ويندوز و UNIX على بيئات الخوادم في بعض المجالات التجارية لفترة طويلة سابقة، أما اليوم فالجميع تقريبًا يستخدم نظام التشغيل لينكس لأنه مجاني في المقام الأول، وإن احتاج لتراخيص فتراخيصه مرنة مقارنة بغيره، بالإضافة لكونه يتمتع بدعم وشعبية كبيرة في الأوساط التقنية، وخاصة في حوسبة الخوادم server computing.
</p>

<p>
	تتنوع <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B1%D8%B6-%D9%85%D9%88%D8%AC%D8%B2-%D9%84%D8%A3%D8%B4%D9%87%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r631/" rel="">توزيعات لينكس</a> ولكل منها مزاياه الخاصة، وبيئاته المفضلة للعمل، وبعض التوزيعات مشمول بخدمات الدعم الفني والصيانة من مزودي الخدمات التجاريين، بينما لا يخضع بعضها الآخر لهذا النوع من الدعم. فما هي أشهر توزيعات لينكس؟ ما الفروق بينها؟ وكيف تختار التوزيعة الأنسب لبناء خادمك السحابي؟
</p>

<h2 id="-1">
	نظرة عامة على التوزيعات
</h2>

<ol>
	<li>
		<strong>أوبنتو Ubuntu</strong>، من أشهر توزيعات لينكس للخوادم والحواسيب الشخصية، تُطرح إصدارات <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">أوبنتو</a> جديدة كل شهرين، أما إصدارات الدعم الفني طويل الأمد فتصدر كل سنتين، وتدوم لخمس سنوات، وستجد أن معظم المحتوى التعليمي المنتشر عن لينكس يتعلق بأوبنتو بسبب شعبيته الكبيرة، ويسجل هذا الدعم الواسع نقطة مهمة لصالح أوبنتو على حساب توزيعات لينكس الأخرى.
	</li>
	<li>
		<strong>ديبيان Debian</strong>، هو الأساس الذي يرتكز عليه أوبنتو، وبالتالي تُحدِد قراراته التصميمية طبيعة إصدارات أوبنتو، ويستخدم ديبيان لاحقة أوبنتو نفسها أي <strong>deb.</strong> وأيضًا مدير الحزم نفسه <code>apt</code>، لكن لا يتمتع ديبيان بشعبية كبيرة بين المستخدمين في خوادم الإنتاج، بسبب طابعه التقليدي وافتقاره للدعم التجاري الكافي. ومع ذلك، يفضله العديد من المستخدمين بسبب سهولة نقله من منصة إلى أخرى، ولكونه المنبع الأساسي الذي تفرعت عنه الكثير من توزيعات لينكس العاملة على مختلف المنصات، ومن بينها <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AC%D9%88%D9%84%D8%A9-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%A7%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1371/" rel="">راسبيان Raspbian</a> الذي يعد نظام التشغيل الرسمي والشهير <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">لجهاز راسبيري باي Raspberry Pi</a> وهو حاسوب صغير الحجم ومنخفض التكلفة يستخدم لأغراض متعددة كالتعليم والتطوير والهوايات التقنية.
	</li>
	<li>
		<strong>ريدهات لينكس للمؤسسات Red Hat Enterprise Linux</strong>، واختصاره RHEL، وهو أكثر توزيعات لينكس شعبية، ويتمتع بدعمٍ تجاري، وعلى عكس التوزيعات المستندة إلى ديبيان، فإن <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-virtualbox-r249/" rel="">ريدهات</a> يستخدم حزمًا من نوع <strong>rpm.</strong>، ومدير حزم يدعى <code>dnf</code>، جنبًا إلى جنب مع الأدوات والحلول التي يوفرها ضمن ضمن نظامه البيئي Red Hat Ecosystem، يتطلب استخدام ريدهات اشتراكًا مدفوعًا للحصول على خدمات الدعم الفني، وهذا أمر إلزامي تفرضه شروط الترخيص.
	</li>
	<li>
		<strong>روكي لينكس Rocky Linux</strong>، يستند روكي لينكس إلى توزيعة ريدهات، بالطريقة نفسها التي يستند فيها أوبنتو إلى ديبيان، روكي مجاني على عكس RHEL لذا يُعدّ خيارًا ممتازًا للمستخدمين الذين اعتادوا على استخدام ريدهات لكنهم غير قادرين أو راغبين بدفع رسوم مالية، تُطلق إصدارات روكي لينكس بتوقيت متزامن مع إصدارات ريدهات، حتى التوثيقات مشتركة بينهما.وقد كانت توزيعة CentOS سابقَا تلعب الدور نفسه الذي يقوم به توزيعة روكي حاليًا، ولكن تغير نموذج إصدارها مما دفع المستخدمين للبحث عن بديل مجاني ومستقر كالذي يقدمه روكي.
	</li>
	<li>
		<strong>فيدورا لينكس Fedora Linux</strong>، يستخدم في بيئات سطح المكتب وفي الخودام، ويرتبط فيدورا بتوزيعة ريدهات، فهو موطن التطوير الفعلي لها، تختبر فيه جميع حلول ريدهات قبل نشرها في مشاريع ريدهات، ومن بينها بيئة سطح المكتب <a href="https://academy.hsoub.com/devops/linux/kde-plasma-%D9%85%D9%82%D8%A7%D8%A8%D9%84-gnome-%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D8%B4%D9%87%D8%B1-%D8%A8%D9%8A%D8%A6%D8%A7%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r632/" rel="">Gnome</a> التي يستخدمها أوبنتو وغيره.
	</li>
	<li>
		<strong>آرتش لينكس Arch Linux</strong>، من أشهر توزيعات لينكس الخاصة ببيئات سطح المكتب، لا ينتمي لعائلة ديبيان أو ريدهات، فله حزمه وأدواته خاصة. ولا يعدّ خيارًا مثاليًا لخوادم الإنتاج لكونه لا يعتمد نظام الإصدارات، فالمستخدم يعمل دائمًا على أحدث الحزم المتوفرة، لكنه بالمقابل يوفر توثيقًا جيدًا لمستخدميه، ويعطي مرونة كبيرة للضلعين بالتعامل معه.
	</li>
	<li>
		<strong>ألبين لينكس Alpine Linux</strong>، من أبسط توزيعات لينكس وأصغرها حجمًا، وهو لا يتضمن معظم الأدوات التي اعتدنا وجودها افتراضيًا في لينكس. تمحورت العديد من توزيعات لينكس تاريخيًا حول هذا الهدف لكن ألبين يبقى الأشهر بينها. وهو يستخدم بكثرة في بناء النماذج الأولية للحاويات، وخاصةً في عمليات النشر الحديثة المعتمدة على الحاويات مثل <a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AF%D9%88%D9%83%D8%B1-docker-r607/" rel="">Docker</a>، فعندما يحتاج تطبيقك لنظام تشغيل مصغر يعمل افتراضيًا ضمن الحاوية فألبين هو الخيار الأمثل.
	</li>
</ol>

<p>
	تقلصت الفروق بين توزيعات لينكس مع الزمن، فقد اختلفت كثيرًا في بداية انطلاقتها وخاصة بأمور أساسية مثل: نظام التهيئة init system، ومدير النوافذ، والمكتبات المستخدمة وغير ذلك، أما اليوم تعتمد معظمها الأساسيات نفسها تقريبًا، مثل نظام التمهيد <a href="https://academy.hsoub.com/devops/linux/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D9%85%D9%87%D9%8A%D8%AF-systemd-r284/" rel="">systemd</a> الموحد، وغيره من الأدوات المشابهة.
</p>

<h2 id="-2">
	اختيار التوزيعة المناسبة
</h2>

<p>
	عرضنا في الفقرة السابقة سبعة من أشهر توزيعات لينكس، وتوجد توزيعات غيرها بالتأكيد، لكن معرفتك بهذه التوزيعات مبدئيًا وبالاختلافات بينها ستساعدك على تكوين فكرة عامة عن معايير اختيار التوزيعة، والتي نلخصها بالنقاط التالية:
</p>

<ul>
	<li>
		هل تستخدم منصة أو نظامًا بيئيًا ما يعتمد كليًا على توزيعة معينة، مثل ديبيان أو ريدهات يحتم عليك التوافق معها؟
	</li>
	<li>
		هل تطوّر برمجياتك للعمل في البيئة السحابية أم في بيئة سطح المكتب أم ربما للحاويات؟
	</li>
	<li>
		هل تفرض عليك متطلبات العمل استخدام أحدث الحزم المتوفرة دائمًا بصرف النظر عن أي شيء؟ أم العكس والأولوية عندك لاستخدام الحزم المختبرة جيدًا ومستقرة الأداء؟
	</li>
</ul>

<p>
	بإجابتك عن الأسئلة ستجد أن اختيار التوزيعة المناسبة يرجع لمتطلبات عملك وتفضيلاتك الشخصية، فعلى سبيل المثال إذا كنت تعمل في بيئة سحابية، ولا تربطك أي متطلبات إنتاجية بمنصة محددة نحو النظام البيئي لريدهات أو غيره، فإن أوبنتو عندها يُعدّ خيارًا جيدًا وشائع الاستخدام تستطيع الاعتماد عليه. وستجد في <a href="https://packages.ubuntu.com/jammy/" rel="external nofollow">هذا الرابط</a> على سبيل المثال لا الحصر حزمًا لتوزيعة أوبنتو 22.04، ويمكنك البحث عن مستودعات أخرى على الإنترنت تستضيف حزمًا لتوزيعات لينكس التي تختارها.
</p>

<h2 id="-3">
	إدارة الحزم
</h2>

<p>
	تختلف معظم توزيعات لينكس اختلافًا ملحوظًا في طريقة تعاملها مع حزم الطرف الثالث أي الحزم التي لا تتبع لمستودعاتها الأساسية، سواء في الإنشاء أو الاكتشاف أو التثبيت. ستجد أن توزيعات ريدهات وفيدورا وروكي لينكس لا تستخدم حزمًا خارجية إلّا فيما ندر، فمعظم اعتمادها على الحزم الرسمية، بسبب سياساتها الداخلية الحازمة التي توالي اهتمامًا كبيرًا بتطوير المنتج، وأشهر <a href="https://docs.fedoraproject.org/en-US/epel/" rel="external nofollow">EPEL أو الحزم الإضافية لنظام لينكس للمؤسسات</a>، وهي مجموعة من الحزم المختارة بعناية لتناسب بيئة الشركات، فعندما تتعامل مع النظام البيئي لريدهات ستجده يميّز الحزم المدعومة تجاريًا عن غير المدعومة، فإذا أخذت أي من الحزم الخارجية الشائعة على أوبنتو مثلًا، وحاولت تثبيتها على ريدهات سيُطلب منك إعداد حزم EPEL أولًا.
</p>

<p>
	تعتمد كميات الحزم المتوفرة في مستودعات توزيعتك الرسمية وضرورة استخدامك لها على أمرين أساسيين هما: درجة السيطرة المفروضة على التوزيعة من الشركة الأم، ومسؤوليات الصيانة الموكلة إلى المشرفين التجاريين عليها أو مزودي الخدمة. ومع ذلك تنتشر الحزم الخارجية أو حزم الطرف الثالث على نطاق واسع بين مستخدمي لينكس، ويتمتع الكثير منها بثقتهم، لكن هذه الحزم بالمقابل لا تخضع للصيانة والدعم الفني من الجهات المشرفة على التوزيعات والحزم الرسمية.
</p>

<p>
	تتيح توزيعة أوبنتو للمستخدمين الأفراد إنشاء أرشيفاتهم الخاصة من الحزم الشخصية أو ما يسمى PPAs، التي تتضمن حزم طرف ثالث سبق لهم تثبيتها ويعرضونها للآخرين للاستفادة منها وتثبيتها، تُعدّ هذه النقطة مرونة كبيرة من أوبنتو لكنها قد تضع المستخدم في إشكاليات ناجمة عن التعارض بين بعض حزم PPA المختلفة، وخاصةً إذا لجأ إلى تثبيت أعداد كبيرة منها بالتزامن مع بعضها، فلكل حزمة من ديبيان وأوبنتو متطلباتها الخاصة. يفرض ذلك على مسؤولي PPA لتوزيعة أوبنتو التأكد دائمًا من مطابقتهم لآخر التحديثات الحاصلة على المستودع الأصلي أو مستودع المنبع upstream لتلافي مشكلات عدم التوافق. أما توزيعة آرتش لينكس فتحتوي مستودعًا وحيدًا فقط يسمى مستودع مستخدم آرتش أو AUR، ويضم كافة الحزم المقدمة للمستخدم، ربما تفتقر هذه الطريقة للتنظيم لكنها بالمقابل تتيح لمستخدمي التوزيعة استعمال العشرات من حزم الطرف الثالث.
</p>

<p>
	يمكنك أيضًا تبسيط عملية إدارة الحزم عبر تثبيت برمجيات مخصصة لهذا الغرض، مثل: <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-use-homebrew-on-linux" rel="external nofollow">Homebrew</a> و <a href="https://www.digitalocean.com/community/tutorial-collections/how-to-install-and-use-docker" rel="external nofollow">Docker</a>، استعرض مثلًا هذا الدليل العربي <a href="https://academy.hsoub.com/devops/cloud-computing/docker/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AF%D9%88%D9%83%D8%B1-docker-%D8%B9%D9%84%D9%89-%D9%81%D9%8A%D8%AF%D9%88%D8%B1%D8%A7-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r611/" rel="">لتثبيت دوكر على فيدورا</a>، قد لا تتمتع عمليات النشر المعتمدة على الحاويات بالفعالية المنشودة لجهة استخدامية القرص الصلب، والموارد اللازمة للتثبيت، وهذا ما يعزز انتشار ألبين لينكس المصغرة في هذه البيئات، لكن البرمجيات المعبأة في الحاويات سهلة النقل من توزيعة لأخرى، ولا تفرض عليك إصدارات معينة فكل متطلباتها موجودة بداخلها. أما النقطة الأخيرة التي يجدر بك أخذها في الحسبان أنك لن تحظى بتحديثات أوتوماتيكية لحزمك ما لم تستخدم الحزم الخاصة بالتوزيعة.
</p>

<h2 id="-4">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أهم المعايير المتعلقة باختيار توزيعة لينكس لخادمك السحابي، رغم أن الاعتماد الواسع على الحاويات مثل دوكر وغيرها، قد خفف تأثير توزيعة نظام تشغيل على نوعية البرامج الممكن تشغيلها على الخادم، ومع ذلك يظل اختيار توزيعة لينكس واحدًا من أهم الاعتبارات التي عليك الانتباه لها في رغبت بالحصول على الدعم الفني لنظامك، أو تجهيز بيئتك لمرحلة الإنتاج دون أي مخاوف.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/conceptual-articles/how-to-choose-a-linux-distribution" rel="external nofollow">How to Choose a Linux Distribution</a> لصاحبه Alex Garnett.
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D9%88%D8%AC%D8%AF-100-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%85%D9%86%D9%87%D8%9F-r698/" rel="">ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-%D9%88%D8%A3%D8%A8%D8%B1%D8%B2-%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87-%D9%88%D8%B9%D9%8A%D9%88%D8%A8%D9%87-r2252/" rel="">تعرف على نظام لينكس Linux وأبرز مميزاته وعيوبه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/10-%D8%B7%D8%B1%D9%82-%D9%84%D8%AA%D8%AC%D8%B1%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-%D9%88%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81%D9%87-r638/" rel="">10 طرق لتجربة نظام التشغيل لينكس Linux واستكشافه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">أساسيات إدارة حزم لينكس apt ،yum ،dnf ،pkg</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">811</guid><pubDate>Sat, 22 Jun 2024 15:02:02 +0000</pubDate></item><item><title>&#x634;&#x631;&#x62D; &#x62A;&#x645;&#x647;&#x64A;&#x62F;&#x64A; &#x644;&#x633;&#x637;&#x631; &#x623;&#x648;&#x627;&#x645;&#x631; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%B4%D8%B1%D8%AD-%D8%AA%D9%85%D9%87%D9%8A%D8%AF%D9%8A-%D9%84%D8%B3%D8%B7%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r810/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_06/725394872_.png.fdce8efd212546e9fdfcecd815595188.png" /></p>
<p>
	تقدم لنا الواجهات الرسومية أو GUI تجربةً بصرية بديهية، وسهلة الاستخدام للتعامل مع الحواسيب والهواتف الذكية، والأجهزة اللوحية، فتجدنا ننتقل بين التطبيقات وصفحات الويب والمستندات والصور بنقرات بسيطة على الأيقونات والقوائم المنسدلة وبقية عناصر سطح المكتب التي توفرها نظم التشغيل المختلفة، مثل: ويندوز وماك ولينكس.
</p>

<p>
	وعلى الرغم من سهولة استخدامها من قبل المستخدم العادي إلّا أن واجهات المستخدم الرسومية تبقى قاصرة نوعًا ما عن منحنا التحكم الإداري الكامل بالأجهزة بالكيفية التي نريدها، فقد تمنعنا من عمليات التثبيت أو التعديل أو الحذف لبعض البرامج والميزات والملفات، وهنا يبرز دور واجهة سطر الأوامر.
</p>

<p>
	يشار لها بالرمز CLI وهو اختصار command-line interface، ويُعدّ إتقانها والتعود على استخدامها عبر <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية Terminal</a> من أهم طرق التنقل بين حاسوبك الشخصي والخوادم السحابية، بغرض الوصول إليها والتحكم بها عن بعد بدون الحاجة للواجهات الرسومية.
</p>

<p>
	توجد الواجهات الطرفية (التي تكتب ضمنها الأوامر) في معظم نظم التشغيل الحاسوبية، وتتوفر لها محاكيات خاصة بهيئة تطبيقات تُثبّت على الهواتف الذكية والأجهزة اللوحية. وهي تمنح المستخدمين تحكمًا أكبر بأجهزتهم عبر تعزيز صلاحيات الوصول المتاحة لمدير النظام administrator، وزيادة قدرة المستخدم على تخصيص بيئات العمل، وأتمتة العمليات التي يحتاجها، وإعطائه إمكانية الوصول إلى الأجهزة البعيدة، مثل الخوادم السحابية.
</p>

<p>
	إذا كنت من مستخدمي واجهة سطر الأوامر الجدد، فسيعطيك هذا التمهيد فكرةً جيدة عن أساسيات استخدامها عبر الطرفية، وستكون في نهايته قادرًا على تطبيقها مع لينكس وماك، سواء على حاسوبك الشخصي أو على الخوادم. لمعلومات أكثر يمكنك أيضًا الاطلاع على مقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal" rel="external nofollow">مقدمة إلى طرفية لينكس</a>، ومقال <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-r1471/" rel="">دليل استخدام سطر الأوامر في عملية تطوير الويب من طرف العميل</a>.
</p>

<h2 id="-1">
	فهم النافذة الطرفية
</h2>

<p>
	عندما تستخدم حاسوبًا أو أي هاتف محمول لأول مرة عبر الواجهات الرسومية، ستبدأ رحلة التعرف عليه باستعراض التطبيقات الموجودة، وأماكن توضع الأشياء، لتتمكن من تخصيصه حسب احتياجاتك، والحالة نفسها لاستكشافه مع الطرفية، وهو ما سنتعرف عليه تباعًا ضمن المقال.
</p>

<p>
	الطرفية المستخدمة هنا هي طرفية أوبنتو 20.04، إحدى أشهر توزيعات لينكس، المبني أساسًا على يونيكس، فإذا كان نظام التشغيل على حاسوبك هو لينكس أو ماك يمكنك تطبيق الأمثلة الواردة هنا بحرفيتها، فطرفية النظامين مشابهة لطرفية أوبنتو المعتمدة في المقال، وكليهما مبني على يونيكس. وإذا كنت تستخدم ويندوز يمكنك الاستعانة بمقال <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%AF%D8%A7%D8%AE%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-%D9%81%D9%8A-%D8%A8%D9%8A%D8%A6%D8%A9-%D9%88%D9%87%D9%85%D9%8A%D8%A9-r577/" rel="">تثبيت نظام لينكس داخل نظام ويندوز في بيئة وهمية</a> لتهيئة بيئة لينكس على حاسوبك نفسه.
</p>

<p>
	افتح الآن الطرفية على حاسوبك أو استخدام أحد المواقع التي توفر طرفيات تفاعلية للتجربة مثل <a href="https://glitch.com/" rel="external nofollow">Glitch.com</a>، وستحصل على نافذة شبيهة بهذه الصورة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="150921" href="https://academy.hsoub.com/uploads/monthly_2024_06/img-01-terminal-screenshot.png.a7165b3a0b3b9a6b6f84e535cb247207.png" rel=""><img alt="img 01 terminal screenshot" class="ipsImage ipsImage_thumbnailed" data-fileid="150921" data-unique="ys5c59nt2" src="https://academy.hsoub.com/uploads/monthly_2024_06/img-01-terminal-screenshot.png.a7165b3a0b3b9a6b6f84e535cb247207.png"> </a>
</p>

<p>
	لاحظ رمز الدولار <code>$</code> والمؤشر الوامض هنا ستبدأ الكتابة.
</p>

<p>
	تدّل الرموز الموجودة في نهاية محث الأوامر prompt على مستوى مستخدم الطرفية، وفق التالي، وهي تنطبق على معظم نظم التشغيل المعتمدة على يونيكس أو التي تسمى nix*:
</p>

<ul>
	<li>
		رمز الدولار <code>$</code> للمستخدم العادي أي أنك سجلت دخول بحساب مستخدم عادي.
	</li>
	<li>
		رمز المربع<code>#</code> للمستخدم صاحب أعلى الامتيازات.
	</li>
</ul>

<p>
	يُعرف المستخدم ذو الرمز <code>#</code> بأنه مستخدم الجذر Root، ويُعدّ مستخدمًا مميزًا أو مدير النظام الافتراضي.
</p>

<p>
	ستجد الرمز <code>$</code> في جميع الأمثلة هنا فقد طبقت بواسطة مستخدم عادي، لكنه يستطيع الحصول على امتيازات الجذر باستعمال الأمر <code>sudo</code>.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>ملاحظة مهمة:</strong> إذا كنت تعمل من طرفية تجريبية على موقع فلا لا داعي للقلق حول ما تكتبه وتنفذه، أما لو كنت تعمل من حاسوبك، توخى الحذر مع أي أوامر تنفذها بصلاحية <code>sudo</code> فقد تحدث تغيرات جذرية على حاسوبك، ويمكنك أخذ نسخة احتياطية من الملفات التي تتدرب عليها خاصة مع الأوامر الجديدة عليك.
	</p>
</blockquote>

<p>
	افتح الطرفية على حاسوبك لنبدأ بالأمثلة العملية.
</p>

<h2 id="-2">
	التآلف مع المجلدات
</h2>

<p>
	الأوامر التي نكتبها في سطر الأوامر هي تعليمات تخبر حاسوبك بما تريد تنفيذه، تكتب الأمر، ثم تضغط على زر ENTER أو RETURN ليبدأ التنفيذ.
</p>

<p>
	اكتب مثلًا الأمر التالي في الطرفية، واضغط ENTER:
</p>

<pre class="ipsCode">$ pwd
</pre>

<p>
	نفذ الأمر، وستحصل على الخرج التالي:
</p>

<pre class="ipsCode">/home/sammy
</pre>

<p>
	يرمز الأمر <code>pwd</code> إلى مجلد العمل الحالي، وهو اختصار للعبارة present working directory، ويساعدك على معرفة مكان وجودك الحالي ضمن نظام الملفات أي المجلد الذي تُنفذ منه الأوامر.
</p>

<p>
	مجلد العمل الحالي في مثالنا هو <code>home/sammy/</code>، و<code>sammy</code> هو اسم المستخدم، قد يكون أي اسم آخر، فإذا سجلت دخولًا بحساب مستخدم الجذر <code>root</code> صاحب أعلى الامتيازات، فسيكون مجلد العمل الحالي <code>root/</code>، وعلى حاسوبك الشخصي سيسمى المجلد باسم المستخدم الذي تستعمله، غالبًا ما يطلق مالك الحاسوب اسمه على المستخدم فتجد المجلد باسمه أيضًا.
</p>

<p>
	مجلد العمل الحالي فارغ الآن، لذا سننشئ ضمنه مجلدًا جديدًا اسمه الملفات أو <code>files</code> مثلًا، نخزن فيه الملفات التي ستطبق عليها أمثلة المقال.
</p>

<p>
	تُنشَأ المجلدات بواسطة الأمر <code>mkdir</code>، وهو اختصار لعبارة make directory، ثم نكتب اسم المجلد الذي نود إنشائه بعد الأمر <code>mkdir</code>، يلعب اسم المجلد هنا دور الوسيط، لأنه يمرر القيمة المدخلة إلى الأمر حتى يأخذ بها عند التنفيذ. يشبه الوسيط المفعول به في القواعد النحوية، فهو يمثل ما يتصرف به الفعل أو الأمر البرمجي في حالتنا.
</p>

<p>
	اكتب السطر التالي في الطرفية لديك، يبدأ السطر بالأمر <code>mkdir</code>، ويليه الوسيط <code>files</code> وهو اسم المجلد الذي ننشئه:
</p>

<pre class="ipsCode">$ mkdir files
</pre>

<p>
	اضغط Enter ونفذ الأمر، وفور ظهور المؤشر الوامض في السطر التالي سيكون مجلدك الجديد قد أُنشئ، وتكون جاهزًا لكتابة الأوامر التالية، لن تحصل على خرج يخبرك بإتمام عملية الإنشاء، فقط المؤشر الوامض.
</p>

<h3 id="-3">
	عرض محتويات المجلدات وفهم صلاحيات العمل عليها
</h3>

<p>
	سنستخدم الأمر <code>ls</code> المستوحى من كلمة list، لإظهار محتويات مجلد العمل الحالي (حيث أنشأنا مجلدنا الجديد)، يمكنك بهذه الطريقة التثبت من صحة إنشائه بما أنك لم تحصل على خرج صريح يؤكد ذلك.
</p>

<pre class="ipsCode">$ ls
</pre>

<p>
	انظر الخرج، أنه يؤكد وجود المجلد <code>files</code>:
</p>

<pre class="ipsCode">files
</pre>

<p>
	يعطيك هذا الأمر معلومات عامة عن محتويات مجلد العمل الحالي، وتستطيع الحصول على معلومات تفصيلية أكثر باستعمال الرايات Flags. تكتب الرايات في لينكس بشكل شرطة <code>-</code> متبوعة بحرف. تُمرِر الرايات للأمر الأساسي خياراتٍ إضافية أو وسطاء إضافيين. فعلى سبيل المثال يمكنك إضافة الراية <code>l-</code> للأمر السابق ليظهر خرجه بتنسيق قائمة طويلة فيها معلومات مفصلة عن محتويات المجلد.
</p>

<p>
	جرب كتابة الأمر مع الراية كما يلي:
</p>

<pre class="ipsCode">$ ls -l
</pre>

<p>
	اضغط زر <code>ENTER</code> للتنفيذ، وستحصل على الخرج الآتي:
</p>

<pre class="ipsCode">total 4
drwxr-xr-x 2 sammy sammy 4096 Nov 13 18:06 files
</pre>

<p>
	يشير السطر الأول من الخرج إلى عدد الكتل blocks المحجوزة للمجلد في ذاكرة الحاسوب، عددها هنا 4، أما السطر الثاني فيتضمن صلاحيات المستخدم على المجلد وبعض التفاصيل الأخرى.
</p>

<p>
	يمكنك أيضًا استعمال الراية <code>h-</code> أو <code>human-readable--</code> لتحصل على خرج أكثر مقروئية، فيظهر الحجم المخصص للمجلد في الذاكرة مقدرًا بالكيلو بايت مثلًا أي بصيغة أسهل للقراءة والفهم، كما هو موضح أدناه. ستلاحظ عند تعاملك مع الرايات: أن الشرطة الوحيدة <code>-</code> تشير إلى راية يُعبر عنها بحرف وحيد، والشرطتان <code>--</code> إلى الرايات التي تكتب بالكلمات، وتستخدم بعض الرايات الصيغتين فقد تكتب بحرف وحيد أو بالكلمات، يمكنك أيضًا كتابة أمر متعدد الرايات أو متعدد الوسطاء بتجميع رموز عدة رايات معًا مثل <code>lh-</code>.
</p>

<p>
	انظر الأمرين أدناه لهما المعنى نفسه تمامًا، لكن كل منهما مكتوب بطريقة:
</p>

<pre class="ipsCode">$ ls -lh
</pre>

<pre class="ipsCode">$ ls -l --human-readable
</pre>

<p>
	سيعطي كلاهما الخرج نفسه، وهو مشابه لما حصلنا عليه سابقًا مع فارقٍ وحيد، إذ سيظهر الحجم بتنسيق سهل القراءة بسبب الراية الخاصة بالمقروئية:
</p>

<pre class="ipsCode">total 4.0K
drwxr-xr-x 2 sammy sammy 4.0K Nov 13 18:06 files
</pre>

<p>
	يبين الخرج السابق مجموعة معلومات عن المجلد، مثل: حجمه في الذاكرة 4K، وصلاحيات المستخدمين عليه وغير ذلك، انظر الجدول التالي للتوضيح:
</p>

<table>
	<thead>
		<tr>
			<th>
				نوع الملف
			</th>
			<th>
				الصلاحيات
			</th>
			<th>
				عدد الوصلات
			</th>
			<th>
				اسم المالك
			</th>
			<th>
				مجموعة العمل
			</th>
			<th>
				حجم الملف
			</th>
			<th>
				تاريخ آخر تعديل
			</th>
			<th>
				اسم الملف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				d
			</td>
			<td>
				rwxr-xr-x
			</td>
			<td>
				2
			</td>
			<td>
				sammy
			</td>
			<td>
				sammy
			</td>
			<td>
				4.0K
			</td>
			<td>
				Nov 13 18:06
			</td>
			<td>
				files
			</td>
		</tr>
	</tbody>
</table>

<p>
	يتضمن الجدول سطرًا واحدًا فقط، لأننا نملك مجلدًا واحدًا <code>files</code> في مجلد العمل الحالي <code>home/sammy/</code>، ولو كان لدينا عدة مجلدات أو ملفات كنت ستجد سطورًا بعددها.
</p>

<p>
	لنوضح الآن الرموز الموجودة في بداية السطر الثاني من الخرج:
</p>

<table>
	<thead>
		<tr>
			<th>
				المحرف
			</th>
			<th>
				الوصف
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				d
			</td>
			<td>
				أي مجلد أو directory، والمجلد في علم الحاسوب هو العنصر التنظيمي الذي يحتوي عدة ملفات، وإذا لم يكن العنصر مجلدًا فستجد شرطة <code>-</code> بدل الحرف d
			</td>
		</tr>
		<tr>
			<td>
				r
			</td>
			<td>
				تعني صلاحية القراءة read، وتسمح للمستخدم بفتح الملف وقراءته، أو باستعراض محتويات المجلد
			</td>
		</tr>
		<tr>
			<td>
				w
			</td>
			<td>
				صلاحية الكتابة write، تتيح تعديل محتويات الملف، وإضافة ملفات إلى المجلد أو حذف بعض من ملفاته أو تغيير أسمائها
			</td>
		</tr>
		<tr>
			<td>
				x
			</td>
			<td>
				صلاحية تنفيذ ملف execute أو تشغيله كبرنامج، ومن جهة المجلدات تعني الصلاحية الدخول إلى المجلد والوصول إلى ملفاته
			</td>
		</tr>
	</tbody>
</table>

<p>
	حاول الآن قراءة الخرج السابق مجددًا، فلنبدأ بسلسلة المحارف <code>drwx</code>، يعني المحرف الأول <code>d</code> أن العنصر الموصوف هو مجلد، فلو كان نوعًا آخر، لبدأت السلسلة بالشرطة <code>-</code> بدلًا منه على هذا الشكل <code>rwx-</code>، أما المحارف الثلاثة التالية مخصصة لأذونات مالك المجلد، وتعني أن المالك لديه صلاحيات القراءة والكتابة والتنفيذ على مجلده المجلد <code>files</code>، وإن استبدل أي محرف منها بالشرطة <code>-</code> فسيفقد المالك الصلاحية التي يمثلها هذا المحرف.
</p>

<p>
	وتمثل المحارف الثلاثة التي تليها صلاحيات مجموعة العمل، وهي <code>r-x</code> في حالتنا، وتعني أن لدى المستخدمين المنتمين للمجموعة صلاحيات القراءة والتنفيذ على هذا المجلد، لكن لا يمكنهم التعديل عليه أبدًا فلا يملكون صلاحية الكتابة، إذ إن المحرف <code>w</code> مستبدل بالشرطة <code>-</code>.
</p>

<p>
	أما المحارف الثلاثة الأخيرة <code>r-x</code> فيقصد بها صلاحيات مجموعات العمل الأخرى على المجلد، وكما ترى تنحصر صلاحياتهم في القراءة والتنفيذ، ولا يملكون صلاحية الكتابة على المجلد.
</p>

<p>
	يشير الرقم <code>2</code> (الذي يلي سلسلة المحارف) إلى عدد روابط المجلد، تشبه الروابط Links في لينكس الاختصارات التي تسهل على المستخدمين الوصول إلى نظام الملفات. وعند تنشئ أي ملف أو مجلد سيبني له لينكس تلقائيًا رابطين، رابط مطلق، ورابط ذاتي المرجع يتيح الوصول إليه عبر مسار نسبي، سيتضح لك معنى النسبي والمطلق في القسم التالي من المقال. ويمكنك معرفة المزيد عن روابط لينكس بمراجعة المقال <a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%84%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r371/" rel="">دليل المستخدم للروابط في نظام ملفات لينكس</a>.
</p>

<p>
	ستجد بعد الرقم <code>2</code> كلمة <code>sammy</code> مكررة مرتين، تشير الأولى منها إلى اسم مالك المجلد، وقد تعرفنا على صلاحياته قبل قليل وهي<code>rwx</code>، أما لماذا <code>sammy</code> هو المالك فالسبب أننا أنشأنا المجلد <code>files</code> من حسابه. يفيدك دائمًا معرفة اسم المستخدم مالك الملفات في بيئة العمل الفعلية.
</p>

<p>
	وتدّل كلمة <code>sammy</code> الثانية على اسم مجموعة العمل المستفيدة من المجلد <code>files</code> أي التي تملك حق الوصول إليه، وصلاحياتها كما رأينا <code>r-x</code>، يتطابق اسم المستخدم هنا مع اسم مجموعة العمل، لكنه ليس أمرًا إلزاميًا، فستصادف في بيئات العمل الفعلية مجموعات عمل مختلفة، مثل: مجموعة الموظفين العاديين وقد يكون اسمها staff، ومجموعة مدراء النظام باسم admin مثلًا أو غير ذلك.
</p>

<p>
	أما بقية المعلومات الموجودة في الخرج فهي: الحجم المخصص للمجلد في الذاكرة، وقدره 4 كيلو بايت، بالإضافة إلى تاريخ آخر تعديل أجري عليه قبل تنفيذ التعليمة.
</p>

<p>
	أصبح لدينا الآن أرضية ننطلق منها لقسمنا التالي المتعلق بالتنقل عبر نظام الملفات.
</p>

<h2 id="-4">
	التنقل ضمن نظام الملفات
</h2>

<p>
	تعلمت كيف تحدد موقعك الحالي في نظام الملفات، وكيف تنشئ مجلدًا جديدًا، وتستعرض محتوياته، وتحدد صلاحيات الوصول إليه والتحكم به.
</p>

<p>
	سنجرب الآن التنقل بين مجلدات نظام الملفات، أنشأنا المجلد <code>files</code> في المجلد الأساسي للمستخدم <code>sammy</code> وهو <code>home/sammy/</code>، فما طريقة الانتقال من <code>home/sammy/</code> إلى <code>home/sammy/files/</code>؟ يمكنك الانتقال باستعمال الأمر <code>cd</code>، وهو اختصار للعبارة change directory التي تعني تغيير المجلد، اكتب إذًا السطر التالي في واجهة الطرفية لديك:
</p>

<pre class="ipsCode">$ cd files
</pre>

<p>
	لن تحصل على رسالة أو خرج يؤكد لك صحة تنفيذ الأمر، وأنك في المسار <code>home/sammy/files/</code>، كما هو الحال مع أمر إنشاء المجلد في القسم السابق، ستتلقى فقط المؤشر الوامض، لذا استعمل الأمر <code>pwd</code> لتتأكد من ذلك:
</p>

<pre class="ipsCode">$ pwd
</pre>

<p>
	سيظهر الخرج التالي:
</p>

<pre class="ipsCode">/home/sammy/files
</pre>

<p>
	يؤكد الخرج السابق وجودك في المجلد <code>home/sammy/files/</code> الذي يقع ضمن مجلد المستخدم <code>home/sammy/</code>، تبدو هذه المسارات المفصولة بالشرطات المائلة مألوفة بالنسبة لك؟ ملاحظتك صحيحة لأنها تشبه عناوين URL لمواقع الويب، فهذه المواقع في نهاية الأمر تتوضع ضمن مجلدات على <a href="https://academy.hsoub.com/devops/servers/web/" rel="">خوادم الويب</a>.
</p>

<p>
	يساعدك الأمر <code>/ cd</code> على الوصول إلى المجلد الرئيسي للخادم من أي مكان في نظام الملفات:
</p>

<pre class="ipsCode">$ cd /
</pre>

<p>
	نفذ الآن الأمر التالي لتستعرض محتويات المجلد الرئيسي:
</p>

<pre class="ipsCode">$ ls
</pre>

<p>
	ستحصل على هذا الخرج:
</p>

<pre class="ipsCode">bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  s  sbin  srv  sys  tmp  usr  var
</pre>

<p>
	هذه هي محتويات المجلد الرئيسي <code>/</code> لنظام لينكس، ويسمى أيضًا مجلد الجذر، وهو يختلف تمامًا عن مستخدم الجذر الافتراضي root، ويتمتع بأهمية كبيرة في نظام لينكس إذ يتضمن كل المجلدات الضرورية لعمل نظام التشغيل، فعلى سبيل المثال: يحتوي المجلد الفرعي <code>sys</code> على نواة النظام kernel، ومعلومات النظام عن نظام الملفات الافتراضي، يمكنك معرفة المزيد عن محتويات مجلد الجذر بمراجعة <a href="https://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.html" rel="external nofollow">توثيقات لينكس الرسمية</a>.
</p>

<p>
	لاحظ أن المجلد <code>home/</code> الخاص بالمستخدمين موجودٌ هنا أيضًا، ويمكنك الانتقال إليه من مجلد الجذر <code>/</code> ثم الانتقال إلى المجلد <code>files</code>، أو استخدام الأمر <code>cd</code> والانتقال إلى <code>files</code> مباشرةً من مجلد الجذر <code>/</code> وفق التالي:
</p>

<pre class="ipsCode">$ cd /home/sammy/files
</pre>

<p>
	نفذ الآن الأمر <code>pwd</code> وستحصل على <code>home/sammy/files/</code> في الخرج.
</p>

<p>
	سنعرض الآن المسارات في لينكس، مسار الملف File Path هو توصيف لمكان وجود الملف أو المجلد على حاسوبك أو على الخادم، المسارات نوعان نسبي ومطلق، النسبي هو الذي يحدد موقع الملف أو المجلد الهدف نسبةً إلى مجلد العمل الحالي، يشبه طريقة انتقالنا إلى داخل المجلد <code>/files</code> عندما كنا في مجلد العمل الحالي <code>home/sammy/</code>. أما المسار المطلق فهو موقع الملف انطلاقًا من مجلد الجذر، كما فعلنا في الأمر أعلاه باستخدام <code>home/sammy/files/</code>، فقد بدأنا بمجلد الجذر <code>/</code>، ثم استدعينا <code>home/sammy/</code>، وبعدها <code>/files</code> الموجود بداخله، إذًأ فالمسار المطلق يبدأ دائمًا بإشارة الجذر <code>/</code>.
</p>

<p>
	النقط dot أيضًا هي أسلوب للتنقل عبر المسارات النسبية في لينكس. تشير النقطة الوحيدة <code>.</code> إلى مجلد العمل الحالي، والنقطتان <code>..</code> إلى المجلد الأب، فمثلًا لو كنت في المجلد <code>home/sammy/files/</code> يمكنك استخدام النقطتين للوصول إلى المجلد الأب <code>home/sammy/</code>، وفق التالي:
</p>

<pre class="ipsCode">$ cd ..
</pre>

<p>
	يمكنك اختبار صحة التنفيذ باستخدام <code>pwd</code> لعرض مجلد العمل الحالي، ستحصل عندها على <code>home/sammy/</code>، وتستطيع أيضًا تنفيذ <code>ls</code> لعرض المحتويات فسيظهر لك المجلد <code>files</code>.
</p>

<p>
	يوجد رمزٌ آخر يفيدك في التنقل هو الرمز <code>~</code>، ينقلك مباشرةً من أي مكان في نظام الملفات إلى المجلد الأساسي home للمستخدم الذي سجلت دخولًا باسمه، في مثالنا المسخدم هو sammy والمجلد الأساسي له يدعى <code>home/sammy/</code>، على حاسوبك سيكون باسم المستخدم الذي تنفذ الأوامر من حسابه.
</p>

<p>
	جرب الأمر التالي على الطرفية لديك، وسيأخذك بنقلة واحدة إلى المجلد الأساسي لمستخدمك:
</p>

<pre class="ipsCode">$ cd ~
</pre>

<p>
	سنتعلم في القسم التالي كيفية التعامل مع الملفات النصية.
</p>

<h2 id="-5">
	إنشاء الملفات النصية وتعديلها
</h2>

<p>
	تأكد في البداية من وجدوك في المجلد <code>/files</code>، لديك طريقتين للقيام بذلك، إما الاستعلام عن مسار العمل الحالي بواسطة الأمر <code>pwd</code>، أو الانتقال مباشرة إلى المجلد بواسطة مساره المطلق وفق التالي:
</p>

<pre class="ipsCode">$ cd /home/sammy/files
</pre>

<p>
	سننشئ الآن ملفًا نصيًا بلاحقة <code>txt.</code> وهي لاحقة قياسية يقرأها نظام التشغيل بدون أي برامج إضافية كما هو الحال مع ملفات <code>doc.</code> مثلًا. والنصوص المكتوبة ضمن الملفات من نوع <code>txt.</code> هي نصوص غير منسقة، يمكن استخدامها بسهولة داخل نافذة سطر الأوامر، أو عند التعامل مع النصوص برمجيًا، مثل: التحليل الآلي للنص، أو سحب المعلومات من نص معين، أو غير ذلك.
</p>

<p>
	سننشئ الملف بكتابة الأمر <code>touch</code>، المخصص لإنشاء الملفات النصية وتعديلها، ثم تمرير اسم الملف النصي بصفته وسيطًا له، وفق التالي:
</p>

<pre class="ipsCode">$ touch ocean.txt
</pre>

<p>
	بمجرد الضغط على زر <code>ENTER</code> ستنتقل لسطر جديد في نافذة سطر الأوامر بدون أي رسالة تؤكد إنشاء الملف النصي، لذا يمكنك استعراض محتويات المجلد <code>/files</code> للتأكد من وجود الملف بداخله.
</p>

<pre class="ipsCode">$ ls
</pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode">ocean.txt
</pre>

<p>
	أنشأنا إذًا الملف النصي <code>ocean.txt</code> لكنه فارغ، ولو أردنا إنشاء ملف نصي مجهز ببعض الكلمات فسيفيدنا في ذلك الأمر <code>echo</code> المخصص لعرض السلاسل النصية في نافذة سطر أوامر لينكس.
</p>

<p>
	يعمل الأمر <code>echo</code> على ترديد ما تكتبه بعده في نافذة سطر الأوامر. لنجرب ذلك بالعبارة المعتادة <code>!Hello, World</code>:
</p>

<pre class="ipsCode">$ echo Hello, World!
</pre>

<p>
	وهذا هو الخرج:
</p>

<pre class="ipsCode">Hello, World!
</pre>

<p>
	يأتي اسم <code>echo</code> أو الصدى من إيكو حورية الجبل التي تردد ما يقال لها فقط دون أي قدرة على حديث نابع من نفسها، حسب الأسطورة اليونانية القديمة في كتاب التحولات لأوفيد، والأمر <code>echo</code> هنا يكرر ما يكتب بعده فقط دون اجتهاد، وفي مثالنا أظهر العبارة <code>!Hello, World</code> كما هي في نافذة سطر الأوامر. أما لو رغبت باستخدامه لتخزين هذه العبارة أو غيرها في ملف نصي ما، فيتعين عليك كتابته بهذه الطريقة:
</p>

<pre class="ipsCode">$ echo "Sammy the Shark" &gt; sammy.txt
</pre>

<p>
	يبدأ السطر السابق بالأمر <code>echo</code>، يليه العبارة النصية التي نريد كتابتها في الملف، وبعده سهم إعادة التوجيه <code>&lt;</code>، ثم اسم الملف النصي الجديد <code>sammy.txt</code>.
</p>

<p>
	تفحص الآن وجود الملف <code>sammy.txt</code> بواسطة الأمر <code>ls</code> وفق التالي:
</p>

<pre class="ipsCode">$ ls
</pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode">ocean.txt  sammy.txt
</pre>

<p>
	يظهر الخرج السابق وجود ملفين في المجلد <code>home/sammy/files/</code>، يمكنك استعراض الملف <code>sammy.txt</code> للتأكد من وجود العبارة النصية التي خزنتها فيه، وذلك باستخدام الأمر <code>cat</code>، وهو من <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B1%D8%AC%D8%B9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B4%D9%87%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r615/" rel="">أشهر أوامر لينكس</a>، ويستعمل لعرض مضمون الملفات النصية ووظائف أخرى تتعلق بها:
</p>

<pre class="ipsCode">$ cat sammy.txt
</pre>

<p>
	نفذ الأمر وستحصل على الخرج التالي:
</p>

<pre class="ipsCode">Sammy the Shark
</pre>

<p>
	جرب استخدام <code>cat</code> مع الملف <code>ocean.txt</code>، لن تحصل على شيء لأنه فارغ من أي محتوى، أضف إليه أي عبارة تريدها بواسطة الأمر <code>echo</code> كما شرحنا سابقًا، سنضيف مثلًا اقتباسًا شهيرًا للكاتبة زورا نيل هيرستون، انظر للأمر التالي:
</p>

<pre class="ipsCode">$ echo "Some people could look at a mud puddle and see an ocean with ships." &gt; ocean.txt
</pre>

<p>
	استخدم <code>cat</code> معه مجددًا ولاحظ الفرق في الخرج:
</p>

<pre class="ipsCode">Some people could look at a mud puddle and see an ocean with ships.
</pre>

<p>
	سنتعرف الآن على طريقة تعديل محتوى الملف النصي، ستحتاج لهذا العمل محرر نصوص يعمل مع سطر الأوامر، الخيارات متنوعة أبرزها: <a href="https://academy.hsoub.com/programming/workflow/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-vim-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r71/" rel="">vim</a> و <a href="https://academy.hsoub.com/programming/workflow/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%A5%D9%8A%D9%85%D8%A7%D9%83%D8%B3-emacs-r1761/" rel="">Emacs</a> و <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D8%B1-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A%D9%85-vim-%D9%88%D9%86%D8%A7%D9%86%D9%88-nano-r1590/" rel="">nano</a>. سنستخدم هنا nano.
</p>

<p>
	يمكنك استدعائه بالأمر <code>nano</code> وتمرير اسم الملف الذي تريده تعديله بصفته وسيطًا له، انظر التالي:
</p>

<pre class="ipsCode">$ nano sammy.txt
</pre>

<p>
	سيفتح الآن الملف <code>sammy.txt</code>، وتجد فيه المحتوى التالي:
</p>

<pre class="ipsCode">Sammy the Shark
</pre>

<p>
	حرك المؤشرة باستعمال أسهم لوحة المفاتيح لتصل إلى نهاية العبارة الموجودة في الملف، واكتب ما تريده بعدها.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>ملاحظة:</strong> لا يمكنك استعمال الماوس مع نافذة سطر الأوامر، سواء للتنقل عبر نظام الملفات أو لتحرير النصوص، فالاعتماد الكلي هنا على لوحة المفاتيح، وخاصةً أسهم التمرير.
	</p>
</blockquote>

<p>
	لنفترض أنك أضفت التعديلات التالية إلى الملف:
</p>

<pre class="ipsCode">Sammy the Shark

Hello, I am Sammy.
I am studying computer science.
Nice to meet you!
</pre>

<p>
	حان الآن موعد الحفظ، فكيف تحفظ التعديلات؟ لاحظ الكلمات الموجودة في أسفل النافذة الطرفية لديك، تبدو مثل هذا:
</p>

<pre class="ipsCode">^G Get Help   ^O WriteOut   ^R Read File  ^Y Prev Page  ^K Cut Text   ^C Cur Pos
^X Exit       ^J Justify    ^W Where Is   ^V Next Page  ^U UnCut Text ^T To Spell
</pre>

<p>
	هي تشرح نفسها نوعًا ما، فبجانب كل رمز كلمة توضح وظيفته.
</p>

<p>
	أو ما ينبغي معرفته أن الرمز <code>^</code> يشير لزر <code>CTRL</code> أو <code>Control</code> على لوحة المفاتيح. وما دام أننا أنهينا التعديلات سنضغط <code>CTRL</code> مع حرف <code>X</code> معًا لنحصل على مفعول <code>Exit</code>، ونغلق الملف، وانتبه لكتابة الحرف <code>x</code> حرف صغير أي بدون استخدام الزر <code>Shift</code>.
</p>

<pre class="ipsCode">CTRL x
</pre>

<p>
	ستجدها في التوثيقات مكتوبة بصيغة <code>CTRL + X</code> أو <code>Ctrl+x</code>، وهي تعني الضغط على الزرين في الوقت نفسه.
</p>

<p>
	اضغط الزرين الآن، وستحصل مباشرةً على الرسالة التالية:
</p>

<pre class="ipsCode">Save modified buffer?                          
 Y Yes
 N No           ^C Cancel
</pre>

<p>
	اضغط الزر <code>Y</code> لحفظ التغييرات.
</p>

<pre class="ipsCode">Y
</pre>

<p>
	وسيؤكد لك النظام عملية الحفظ بإظهار الخرج التالي:
</p>

<pre class="ipsCode">File Name to Write: sammy.txt
</pre>

<p>
	تتضمن الرسالة خيارات إضافية مثل الضغط على <code>CTRL + C</code> للإلغاء، لكن إذا كنت واثقًا من رغبتك بالخروج من الملف اضغط على <code>ENTER</code> لحفظ التغييرات على الملف والخروج منه.
</p>

<p>
	لنفترض على سبيل المثال أنك تريد إنشاء عدد من الملفات النصية لطلبة أكاديمية حسوب، ملف لكل طالب، وسامي sammy هو أحد الطلاب، ستنشئ في البداية مجلدًا جديدًا يدعى الطلاب <code>students</code> مثلًا ضمن المجلد <code>/files</code>، ثم تنقل الملف <code>sammy.txt</code> إليه.
</p>

<p>
	أولًا تعليمة إنشاء المجلد:
</p>

<pre class="ipsCode">$ mkdir students
</pre>

<p>
	والآن تعليمة النقل بواسطة الأمر <code>mv</code> (المستوحى من كلمة move)، يأخذ هذا الأمر وسيطين، الوسيط الأول هو الملف المراد نقله، والوسيط الثاني هو موقعه الجديد، انظر التعليمتين التاليتين فلهما النتيجة نفسها:
</p>

<pre class="ipsCode">$ mv sammy.txt students
</pre>

<pre class="ipsCode">$ mv sammy.txt students/sammy.txt
</pre>

<p>
	تعمل <code>mv</code> في التعليمة الأولى على نقل الملف مع الحفاظ على اسمه، أما في الثانية فيمكنك تغيير اسم الملف عند نقله إذا رغبت بذلك، تستطيع مثلًا كتابتها على الشكل التالي:
</p>

<p>
	<code>mv sammy.txt students/sammy-the-shark.txt</code>
</p>

<p>
	إذا استعرضت محتويات المجلد <code>/files</code> باستخدام الأمر <code>ls</code>، ستجد ضمنه الملف <code>ocean.txt</code>، والمجلد الجديد <code>students</code>، انتقل إلى المجلد <code>/students</code>، وفق الآتي:
</p>

<pre class="ipsCode">$ cd students
</pre>

<p>
	أنت الآن ضمن المجلد <code>/students</code>، فلنفترض أنك تحتاج لاستخدام الملف <code>sammy.txt</code> على أنه قالب يسهل عليك إنشاء ملفات بقية الطلاب، فأول ما يتبادر إلى ذهنك هو نسخ الملف <code>sammy.txt</code> إلى عدة نسخ ثم التعديل عليها حسب بيانات كل طالب، تجري عملية النسخ باستخدام الأمر<code>cp</code> وهو اختصار لكلمة copy. وعلى غرار <code>mv</code> فإنه يأخذ وسيطين، الوسيط الأول اسم الملف الأصلي أي المطلوب نسخه، والوسيط الثاني اسم الملف الجديد، انظر التعليمة التالية لإنشاء نسخة من ملف الطالب سامي <code>sammy.txt</code> وتسميتها باسم جديد لتمثل طالب آخر أليكس <code>alex.txt</code> مثلًا:
</p>

<pre class="ipsCode">$ cp sammy.txt alex.txt
</pre>

<p>
	افتح الآن الملف <code>alex.txt</code> باستخدام محرر النصوص، ستجد محتواه مطابق تمامًا لمحتوى الملف <code>sammy.txt</code>، عدّل البيانات التي تحتاج لتعديلها، ليصبح مثلًا كما هو مبين أدناه، ونود لفت انتباهك إلى قدرتك على حذف سطر كامل من الملف بخطوة واحدة، عبر الضغط على <code>CTRL + K</code> معًا:
</p>

<pre class="ipsCode">Alex the Leafy Seadragon

Hello, I am Alex.
I am studying oceanography.
Nice to meet you!
</pre>

<p>
	أغلق الملف الجديد الآن واحفظ التغييرات، بالضغط على <code>CTRL + x</code> ثم <code>Y</code> ثم <code>ENTER</code>.
</p>

<p>
	حاول إنشاء ملفات نصية أخرى للتدريب، وعندما تصبح جاهزًا انتقل معنا للقسم التالي لنتعرف على أوامر ومميزات جديدة.
</p>

<h2 id="-6">
	الإكمال التلقائي وسجل الأوامر المحفوظة
</h2>

<p>
	توفر معظم واجهات سطر الأوامر مميزات، مثل: الإكمال التلقائي للأوامر، وإعادة استخدام الأوامر السابقة، تسهل عمل المستخدمين عليها، وتسرّع وتيرته.
</p>

<p>
	جرب بنفسك، حاول مثلًا كتابة الأمر <code>cat</code> مع الأحرف الأولى من أحد الملفات التي عملنا عليها نحو <code>cat sa</code> قبل أن تكمل اسم الملف <code>sammy.txt</code> بالكامل، اضغط على زر <code>TAB</code> من لوحة المفاتيح ولاحظ ميزة الإكمال التلقائي، فالطرفية ستكمل اسم الملف تلقائيًا وتظهره لك دون أن تكمل أنت كتابته، كما هو مبين أدناه:
</p>

<pre class="ipsCode">$ cat sammy.txt
</pre>

<p>
	والآن إذا ضغطت <code>ENTER</code> ستنفذ التعليمة بطريقة طبيعية، ويظهر محتوى الملف النصي.
</p>

<p>
	حاول بعدها الضغط على السهم الأعلى <code>UP</code> من أسهم التمرير في لوحة المفاتيح، وشاهد ما سيظهر، ستجد أن الطرفية تعرض عليك آخر أمر نفذته، اضغط السهم <code>UP</code> بوتيرة أسرع وسترى الأوامر التي نفذتها مؤخرًا، يمكنك بذلك الوصول إلى الأمر الذي تريد إعادة تنفيذه دون كتابته من جديد.
</p>

<p>
	تستطيع أيضًا استعراض كافة الأوامر المستخدمة سابقًا في هذه الجلسة، باستخدام الأمر <code>history</code>:
</p>

<pre class="ipsCode">$ history
</pre>

<p>
	ستحصل في الخرج على سجل يتضمن جميع الأوامر المحفوظة، مثل التالي:
</p>

<pre class="ipsCode">    1  pwd
    2  mkdir files
    3  ls
    4  ls -l
...
</pre>

<p>
	تفيدك هذه الاختصارات في رفع إنتاجيتك عند العمل مع واجهة سطر الأوامر.
</p>

<h2 id="-7">
	العمل مع الملفات عبر الويب
</h2>

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

<p>
	انتقل للمجلد <code>/files</code>:
</p>

<pre class="ipsCode">$ cd /home/sammy/files
</pre>

<p>
	سنستخدم الآن الأمر <code>crul</code>، والذي يرمز إلى client URL، لجلب البيانات من الويب إلى طرفيتك. رفعنا -يقول كاتب المقال- ملف نصيًا لغرض التجربة يتضمن مقطعًا قصيرًا من رواية على خادم سحابي، وسنستخدم عنوان URL الخاص به في تعليمة <code>crul</code> التالية:
</p>

<pre class="ipsCode">$ curl https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt
</pre>

<p>
	ما إن تضغط على زر <code>ENTER</code> ستتلقى محتوى الملف النصي في واجهة الطرفية، وهو في حالتنا مقطعًا من رواية، وفق التالي:
</p>

<pre class="ipsCode">"You like the sea, Captain?"

"Yes; I love it! The sea is everything. It covers seven tenths of the terrestrial globe.
...
"Captain Nemo," said I to my host, who had just thrown himself on one of the divans, "this
is a library which would do honor to more than one of the continental palaces, and I am
absolutely astounded when I consider that it can follow you to the bottom of the seas."
</pre>

<p>
	ظهر محتوى الملف النصي على واجهتك الطرفية، لكنه في الواقع لم يخزن على حاسوبك المحلي حتى الآن، يمكنك التأكد من ذلك بواسطة الأمر <code>ls</code>، فما طريقة تخزينه إذًا؟ الحل هو استخدام الخيار أو الراية <code>O-</code> مع الأمر <code>curl</code>، وعندها سيُخَزَّن الملف محليًا باسم الملف البعيد نفسه.
</p>

<pre class="ipsCode">$ curl -O https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt
</pre>

<p>
	وستحصل على رسالة في واجهة الطرفية، تخبرك بنجاح عملية التنزيل، تشبه صيغتها التالي:
</p>

<pre class="ipsCode">% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2671  100  2671    0     0  68487      0 --:--:-- --:--:-- --:--:-- 68487
</pre>

<p>
	يمكنك أيضًا تنزيل الملف من الويب وحفظه على الحاسب باسم مختلف عن اسمه الأصلي، بالاسم <code>jules.txt</code> مثلًا، وذلك بتمرير الاسم الجديد بصفة وسيط إضافي للأمر <code>crul</code> مع الخيار <code>o-</code>، وفق التالي:
</p>

<pre class="ipsCode">$ curl -o jules.txt https://assets.digitalocean.com/articles/command-line-intro/verne_twenty-thousand-leagues.txt
</pre>

<p>
	تستطيع الآن عرض الملف بواسطة <code>cat</code>، أو تحرير عبر <code>nano</code>.
</p>

<p>
	يفيدك أيضًا مراجعة المقال <a href="https://academy.hsoub.com/programming/workflow/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-%D9%85%D9%86-%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-r1471/" rel="">دليل استخدام سطر الأوامر في عملية تطوير الويب من طرف العميل</a> لمزيد من الأمثلة من المعلومات المفيدة.
</p>

<p>
	يتناول القسم الأخير من المقال طرق حذف الملفات وإنهاء تنفيذ الأوامر.
</p>

<h2 id="-8">
	حذف الملفات وإنهاء تنفيذ الأوامر
</h2>

<p>
	ستتعرض بالتأكيد لحالات تحتاج فيها لحذف ملف أو مجلد، أو لإنهاء تنفيذ أمر معين، أو الخروج من تطبيق تستخدمه، سنتعلم ذلك.
</p>

<p>
	بالعودة إلى مثال طلاب الأكاديمية، فلنفترض أنك تحتاج لحذف ملفات بعض الطلاب لأنهم تخرجوا مثلًا. تأكد أولًا من وجودك في المجلد <code>/students</code>، يمكنك تنفيذ الأمر التالي للانتقال إليه:
</p>

<pre class="ipsCode">$ cd /home/sammy/files/students
</pre>

<p>
	نفذ الآن الأمر <code>ls</code> لاستعراض محتويات المجلد، وبما أننا أنشأنا عددًا من الملفات مسبقًا، فستحصل على الخرج التالي:
</p>

<pre class="ipsCode">alex.txt  drew.txt  jamie.txt  jesse.txt  sammy.txt  taylor.txt
</pre>

<p>
	يمكنك حذف الملفات المفردة من مجلد الطلاب <code>/students</code> باستخدام الأمر <code>rm</code>.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تحذير:</strong> لا يمكنك التراجع عن حذف الملفات، لذا كن حذرًا، وتأكد من رغبتك بحذف الملف قبل الضغط على زر <code>ENTER</code>.
	</p>
</blockquote>

<p>
	لنحذف مثلًا الملف <code>sammy.txt</code> وفق الآتي:
</p>

<pre class="ipsCode">$ rm sammy.txt
</pre>

<p>
	استعرض مجددًا محتويات المجلد باستخدام <code>ls</code>، ولاحظ عدم وجود الملف <code>sammy.txt</code> بينها:
</p>

<pre class="ipsCode">alex.txt  drew.txt  jamie.txt  jesse.txt  taylor.txt
</pre>

<p>
	إذا رغبت بحذف المجلد <code>/students</code> كاملًا مع كافة محتوياته، فستحتاج للأمر <code>rmdir</code> الذي يختصر العبارة remove directory. انتقل في البداية إلى المجلد الأب <code>files</code> ونفذ أمر حذف المجلد <code>/students</code> من هناك، فلا يمكنك حذف أي مجلد طالما أنك تعمل ضمنه.
</p>

<pre class="ipsCode">$ cd ..
</pre>

<p>
	نحن الآن في المجلد <code>/home/sammy/files/</code>، وحاول حذف مجلد الطلاب <code>students</code> من هنا باستخدام <code>rmdir</code>، وفق التالي:
</p>

<pre class="ipsCode">$ rmdir students
</pre>

<p>
	وستحصل على رسالة الخطأ التالية في الخرج:
</p>

<pre class="ipsCode">rmdir: failed to remove 'students': Directory not empty
</pre>

<p>
	تفيد الرسالة بعدم إمكانية حذف المجلد لأنه غير فارغ، يمكنك بالتأكيد معالجة الموضوع بحذف الملفات الفردية من المجلد <code>students</code> واحدًا تلو الآخر، ثم حذف المجلد، لكنها ليست بالطريقة الأمثل وخاصة إذا كان عدد الملفات كبير. بالمناسبة يمكنك إنشاء مجلد فارغ ومحاولة حذفه باستخدام الأمر <code>rmdir</code> والتأكد من فعاليته مع المجلدات الفارغة.
</p>

<p>
	أما حذف المجلدات الممتلئة، فيتطلب استخدام الأمر <code>rm</code> مع الراية أو الخيار <code>r-</code>، ترمز هذه الراية إلى الكلمة الإنكليزية <a href="https://ar.wikipedia.org/wiki/%D8%B9%D9%88%D8%AF%D9%8A%D8%A9" rel="external nofollow">recursion أو العودية</a> التي تصف الدوال أو العمليات الحاسوبية التي تستدعي نفسها ذاتيًا مرارًا وتكرارًا، فبالتالي عند استخدامها مع أمر الحذف سيُحذَف العنصر مع كل محتوياته. اكتب إذًا الأمر التالي، ومرر اسم المجلد <code>students</code> بعد أمر الحذف:
</p>

<pre class="ipsCode">$ rm -r students
</pre>

<p>
	تأكد من صحة حذف المجلد <code>/students</code> مع جميع ملفاته، بتنفيذ الأمر <code>ls</code>.
</p>

<p>
	أنهيت أعمالك في الطرفية سواء كنت تعمل على حاسوبك الشخصي أو تتصل بخادم بعيد وتريد الخروج منها؟ اكتب إذًا الأمر <code>exit</code> وفي حال كنت متيقنًا من كل شيء اضغط على زر <code>ENTER</code>، فمجرد مغادرتك لجلسة العمل لن تتمكن من استعادتها مجددًا.
</p>

<pre class="ipsCode">$ exit
</pre>

<p>
	ستحصل على الخرج التالي بعد الضغط على زر إنتر، ليؤكد لك إنتهاء جلسة العمل وخروجك منها.
</p>

<pre class="ipsCode">Session ended
</pre>

<h2 id="-9">
	الخلاصة
</h2>

<p>
	قدم المقال بداية تعريفية لكل راغب ببدء العمل مع الواجهة الطرفية وسطر الأوامر، سواء لإدارة الحواسيب أو الخوادم السحابية البعيدة.
</p>

<p>
	يوجد العديد من المقالات المفيدة في هذا المجال على أكاديمية حسوب، استعرض قسم <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a> وقسم <a href="https://academy.hsoub.com/devops/cloud-computing/" rel="">الحوسبة السحابية</a>، واقرأ ما يناسبك منها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/a-linux-command-line-primer" rel="external nofollow">A Linux Command Line Primer</a> لصاحبته Lisa Tagliaferri.
</p>

<p>
	اقرأ أيضًا
</p>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">ما هو سطر الأوامر؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B1%D8%AC%D8%B9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B4%D9%87%D8%B1-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r615/" rel="">مرجع إلى أشهر أوامر لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/php/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-cli-%D9%81%D9%8A-php-r1176/" rel="">التعامل مع واجهة سطر الأوامر (CLI) في PHP</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A6%D8%A9-%D9%88%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r1859/" rel="">إعداد البيئة وواجهة سطر الأوامر في بايثون</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">810</guid><pubDate>Thu, 13 Jun 2024 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r799/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_12/---.png.e21ea7fb8d2c8318d20a1e9a5a9d9ebe.png" /></p>
<p>
	لم يعد يخفى على أي مهتم أو عامل في مجال تقنيات الحاسوب أهمية نظام التشغيل لينكس في شتى المجالات انطلاقًا من استثمار حواسب اللوحة الواحدة مثل حواسيب راسبيري باي مرورًا بالحواسب المكتبية والشبكات الحاسوبية وصولًا إلى خوادم ويب وتقنيات الحوسبة السحابية. لينكس موجود في كل مكان، لكن لا يزال بعض الغموض يحيط بمفاهيمه وخاصة للقادمين الجدد، لهذا سنحاول في هذا المقال شرح هذه المفاهيم بشكل مبسط والإجابة عن أكثر التساؤلات التي ترتبط بنظام لينكس.
</p>

<h2 id="">
	ما هو لينكس
</h2>

<p>
	<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس Linux</a> ببساطة نظام تشغيل للحواسب والتجهيزات المشابهة لها كما هو حال ويندوز Windows أو ماك أو إس Mac OS أو أندرويد Android. أما نظام التشغيل Operating System واختصارًا OS فهو مجموعة متكاملة من البرمجيات الخاصة التي تتيح استثمار حاسوبك أو هاتفك.
</p>

<p>
	يُعد لينكس من أكثر <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">أنظمة التشغيل</a> انتشارًا في العالم، ولا يقتصر استعماله على الحواسب الشخصية، والهواتف الذكية بل يتعدى ذلك إلى إدارة الأغلبية الساحقة من <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خوادم الويب</a>، وهو <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">نظام التشغيل</a> الذي تستخدمه أكثر الحواسيب الخارقة Super Computer في العالم، ويُعد أساسًا لأندرويد أكثر أنظمة تشغيل الهواتف المحمولة انتشارًا.
</p>

<p>
	قد يخطر في بالك الآن السؤال التالي: هل لينكس هو نفس النظام الذي يُشغّل مختلف التجهيزات السابقة أيًا كان عملها ومواصفاتها؟ في الواقع لينكس هو مجموعة أساسية من البرمجيات التي تدير التخاطب بين مكوّنات الحواسيب على أكمل وجه تُدعى النواة Kernel وتمثل المكوّن الجوهري لنظام التشغيل. يتميز لينكس بأنه <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a> أي يمكن التعديل على شيفراته واستخدامها بحرية تامة، وهذا ما جعل الكثير من الشركات تنطلق من نواة لينكس لبناء أنظمة تشغيل جديدة وأخرى مشتقة منها (تُدعى <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%86%D9%87%D8%A7%D8%A6%D9%8A-%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r48/" rel="">بالتوزيعات Distros</a>)،على عكس أنظمة التشغيل مغلقة المصدر والتي لا تفصح عن شيفراتها.
</p>

<p>
	لا بد وأن يثير هذا الجواب في نفسك تساؤلات أخرى مفادها أن هذا النظام أكثر تعقيدًا مما أعتقد، ولا بد أن يكون استثماره صعبًا طالما أنه في الجوهر نواة تُبنى عليها أنظمة تشغيل أخرى. نعم، قد يكون ما تفكر به صحيحًا لكن إلى حدٍ معين. لن تتعامل كمستثمر للحاسوب في واقع الأمر مع لينكس "النواة" بل مع لينكس "التوزيعة"، فقد بنيت توزيعات لينكس لتتمكن من إدارة حاسوبك بنفسك وفق أدق التفاصيل التي لا تتيحها أنظمة تشغيل أخرى، ولهذا الأمر إيجابياته وسلبياته، لكنها تؤمن لك كذلك بيئة تشغيل آمنة ومثالية إن أردت فقط أن تستثمر حاسوبك في إنجاز أعمالك اليومية أيًا كانت طبيعتها.
</p>

<p>
	إذًا دعونا نلخص ما تعلمناه عن لينكس حتى الآن:
</p>

<ul>
	<li>
		لينكس نظام تشغيل يمكنك من استثمار الحواسب والتجهيزات الذكية.
	</li>
	<li>
		لينكس نظام تشغيل مفتوح المصدر يمكن الاطلاع على شيفرة بنائه وتعديلها واستخدامها بحرية.
	</li>
	<li>
		يمكن أن نستخدم نواة لينكس لبناء توزيعات مختلفة (أنظمة تشغيل مبنية على النواة) وطرحها تجاريًا.
	</li>
	<li>
		لينكس نظام تشغيل شديد المرونة يتيح لك الوصول إلى خفايا حاسوبك لكنه يساعدك على إنجاز أعمالك الروتينية البسيطة أيضًا بمنتهى السهولة والأمان.
	</li>
</ul>

<h2 id="-1">
	نظرة إلى نظام التشغيل لينكس
</h2>

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

<ol>
	<li>
		برمجيات الإقلاع Bootloader
	</li>
	<li>
		برمجيات إعداد النظام Init System
	</li>
	<li>
		الخدمات الخلفية Daemons
	</li>
	<li>
		سطح المكتب Desktop
	</li>
	<li>
		البرامج والتطبيقات Application.
	</li>
	<li>
		خادم الرسوميات Graphical server
	</li>
	<li>
		النواة Kernel
	</li>
</ol>

<h3 id="-2">
	برمجيات إقلاع نظام لينكس
</h3>

<p>
	وهي مجموعة من البرمجيات التي تدير عملية إقلاع الحاسوب. تمتد مرحلة الإقلاع من لحظة ظهور بعض الكتابات على الشاشة حتى لحظة ظهور شعار لينكس، وهذا كل ما يهمك كمستثمر للحاسوب. فظهور شعار نظام التشغيل يدل على أن حاسوبك يعمل دون مشاكل وقد سلم الأمر إلى نظام التشغيل لينكس الذي بدأ بتحضير نفسه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139846" href="https://academy.hsoub.com/uploads/monthly_2023_12/01_boot_end.png.fd146ac216d40d46492a457988e920d5.png" rel=""><img alt="01 boot end" class="ipsImage ipsImage_thumbnailed" data-fileid="139846" data-unique="o8b4cv5ip" src="https://academy.hsoub.com/uploads/monthly_2023_12/01_boot_end.png.fd146ac216d40d46492a457988e920d5.png"> </a>
</p>

<p style="text-align: center;">
	"نهاية مرحلة الإقلاع وبداية مرحلة إعداد النظام"
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن لم تر شعار لينكس على الشاشة فأنت تواجه مشاكل في الإقلاع. أي أن حاسوبك يعاني مشاكل في العتاد الصلب أو في ضبط إعداداتها أو أن برمجيات الإقلاع تالفة.
	</p>
</blockquote>

<h3 id="-3">
	برمجيات إعداد النظام
</h3>

<p>
	تتكون هذه المنظومة من مجموعة كبيرة من البرمجيات الصغيرة التي تعمل في الخلفية وتُعرف بالخدمات Daemons وتنحصر مهمة هذه الخدمات في تحضير نظام التشغيل ليكون جاهزًا للتخاطب مع المستخدم من جميع النواحي. إذًا تدير هذه المنظومة ببساطة الفترة التحضيرية الممتدة من نهاية مرحلة الإقلاع حتى ظهور سطح المكتب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139840" href="https://academy.hsoub.com/uploads/monthly_2023_12/02_init_system.png.6fd5c63b11ca4cc678ddba4ca5447c8d.png" rel=""><img alt="02 init system" class="ipsImage ipsImage_thumbnailed" data-fileid="139840" data-unique="nnyal18wj" src="https://academy.hsoub.com/uploads/monthly_2023_12/02_init_system.png.6fd5c63b11ca4cc678ddba4ca5447c8d.png"> </a>
</p>

<p>
	"شاشة توضح تشغيل منظومة برمجيات الإعداد لبعض الخدمات الخلفية قبل الوصول إلى سطح المكتب"
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن لم تصل إلى سطح المكتب فهناك مشكلة في بعض خدمات إعداد نظام لينكس.
	</p>
</blockquote>

<h3 id="-4">
	الخدمات الخلفية
</h3>

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

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		بإمكانك عندما تألف نظام تشغيل لينكس أن توقف أو تشغّل الكثير من الخدمات، ولهذا الأمر أهمية كبيرة.
	</p>
</blockquote>

<h3 id="-5">
	سطح المكتب
</h3>

<p>
	وهي واجهة المستخدم التي تتعامل من خلالها مع نظام التشغيل. يتفاعل المستخدم عمومًا مع نظام لينكس إما من خلال كتابة تعليمات يدويًا عبر برنامج خاص يُدعى <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية Terminal</a> وعليه في هذه الحالة أن يتعلم كل ما يحتاجه من تعليمات وأوامر وطريقة صياغتها وهذا بالطبع أمر ليس بالهين ويتطلب ممارسة وجهدًا. أما الطريقة الأسهل والأكثر شعبية لمستثمري لينكس فهي بيئة سطح المكتب الرسومية GUI التي يتفاعل معها المستخدم بالنقر على الأيقونات وفتح النوافذ واختيار الأوامر من القوائم التي تُعرض كما هو الحال في نظامي ويندوز وماك. وعلى خلاف ويندوز وماك يمكن أن يختار مستخدمي لينكس بيئة سطح المكتب من بين بيئات مختلفة مثل (جنوم Gnome, سينامن Cinnamon، بانثيون Pantheon، كيدي KDE وغيرها..).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139844" href="https://academy.hsoub.com/uploads/monthly_2023_12/03_cinnamon_dt.png.1af49f0f4ca6136fc50b3c97b41d6dcf.png" rel=""><img alt="03 cinnamon dt" class="ipsImage ipsImage_thumbnailed" data-fileid="139844" data-unique="xllzuurii" src="https://academy.hsoub.com/uploads/monthly_2023_12/03_cinnamon_dt.png.1af49f0f4ca6136fc50b3c97b41d6dcf.png"> </a>
</p>

<p style="text-align: center;">
	"شاشة سطح مكتب سينامن"
</p>

<p>
	لا يعني هذا أنك ستعاني حتى تثبت سطح المكتب، بل تأتي كل توزيعة من توزيعات لينكس مع بيئة سطح مكتب افتراضية (توزيعة أوبنتو Ubuntu مثلًا تستخدم جينوم كبيئة سطح مكتب افتراضية) يمكنك إن أحببت تغييرها لاحقًا.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		عليك التمييز في لينكس بين بيئة سطح المكتب ونظام التشغيل فهما شيئان مختلفان على خلاف أنظمة تشغيل أخرى مثل ويندوز.
	</p>
</blockquote>

<h3 id="-6">
	البرامج والتطبيقات
</h3>

<p>
	تساعدك بيئة سطح المكتب على إدارة الملفات والتجهيزات المختلفة، لكنها لا تضم كل البرمجيات التي قد تحتاجها، علمًا أن معظم توزيعات لينكس تأتي مع حزمة متنوعة من <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B1%D8%A7%D8%AE%D9%8A%D8%B5-%D8%A7%D9%84%D8%A8%D8%B1%D8%A7%D9%85%D8%AC-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r1586/" rel="">البرامج مفتوحة المصدر</a> تغطي معظم احتياجات المستثمر العادي للحاسوب. ستحتاج حتمًا إلى تطبيقات وبرامج أخرى، وكما هو حال نظامي ويندوز وماك بإمكانك البحث عن البرامج التي تريدها من بين آلاف البرامج عالية الجودة  ومفتوحة المصدر، والتي يكون الكثير منها مجاني تمامًا للاستخدام الشخصي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139842" href="https://academy.hsoub.com/uploads/monthly_2023_12/04_libre_office.png.fcebd9c52349b77b7d85907f2ebe0447.png" rel=""><img alt="04 libre office" class="ipsImage ipsImage_thumbnailed" data-fileid="139842" data-unique="isd66doay" src="https://academy.hsoub.com/uploads/monthly_2023_12/04_libre_office.png.fcebd9c52349b77b7d85907f2ebe0447.png"> </a>
</p>

<p style="text-align: center;">
	"تطبيق ليبر-أوفيس المجاني والمفتوح المصدر"
</p>

<p>
	يأتي مع معظم توزيعات لينكس تطبيقات مخصصة مهمتها البحث عن البرامج التي تحتاجها ضمن مخازن موثوقة خاصة بتطبيقات لينكس عبر الإنترنت ثم تثبيتها مباشرة على جهازك بنقرة زر. نذكر من هذه التطبيقات Ubuntu Software Center الذي يأتي افتراضيًا مع توزيعة أوبونتو من لينكس. وهذه ميزة رائعة لنظام لينكس وخاصة للمبتدئين، إذ تجعل تثبيت التطبيقات بسهولة تثبيت أي تطبيق من جوجل بلاي أو آب ستور.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ماذا لو لم أجد البرنامج الذي أحتاجه عند استخدام برنامج البحث؟ هل هناك حل للموضوع؟ نعم يمكنك البحث عنه بنفسك باستخدام أي محرّك بحث، فقد يكون متاحًا على شكل حزمة يمكنك تنزيلها وتثبيتها أو قد يرشدك الموقع إلى طريقة التثبيت باستخدام تعليمات الطرفية.
	</p>
</blockquote>

<h3 id="-7">
	خادم الرسوميات
</h3>

<p>
	وهي منظومة فرعية من نظام التشغيل مهمتها إدارة وعرض الرسوميات على شاشة الحاسوب ويُشار إليها عادة بالاسم "X Server" أو "X" فقط.
</p>

<h3 id="kernel">
	النواة Kernel
</h3>

<p>
	قد لا يهمك كمستثمر لنظام لينكس أمر النواة كثيرًا، لكن لا بد على الأقل أن نوضح باختصار ماهيتها. فالنواة هي التعليمات والأوامر التي تدير عمل المعالج والذواكر وجميع الأجهزة الطرفية التي ترتبط بالحاسوب كالأقراص الصلبة ووحدات الإدخال والإخراج وشاشات العرض ومحوّلات شبكات الاتصال وغيرها. إذًا النواة باختصار هي المكوّن الحقيقي من نظام التشغيل الذي يمكن أن ندعوه "لينكس". تُستخدم هذه النواة في بناء توزيعات لينكس المختلفة وتطويرها وهي بحد ذاتها عرضة للتطوير والتحديث المستمر وآخر إصداراتها ساعة كتابة هذه الكلمات كانت 6.1.
</p>

<h2 id="-8">
	توزيعات نظام لينكس
</h2>

<p>
	حسنًا لقد وصلنا إلى مفترق طرق في رحلتنا! إنها النقطة الأهم في اتخاذ قرار التحوّل إلى نظام لينكس. يُشير مصطلح "لينكس" إلى نواة نظام التشغيل، وقد استخدمت هذه النواة من قبل الأفراد والشركات في بناء نسخ (أو توزيعات Distros) مختلفة النكهات طُوّر كل منها لأغراض محددة ولاستخدامات محددة. تأتي بعض هذه التوزيعات مجانية تمامًا وبعضها الأخر مجاني مع خدمات مأجورة والبعض الآخر مدفوعًا. تعود ملكية بعض النسخ إلى شركات والبعض الآخر إلى مجتمعات المطوّرين لكن ما يجمع بين كل التوزيعات أنها مفتوحة المصدر، فحتى لو دفعت ثمنها ستتمكن من البناء عليها لتطوير توزيعات جديدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139841" href="https://academy.hsoub.com/uploads/monthly_2023_12/05_linux_distro.png.92b26ea783207c5f610f849db043091e.png" rel=""><img alt="05 linux distro" class="ipsImage ipsImage_thumbnailed" data-fileid="139841" data-unique="ifv07kymf" style="width: 450px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_12/05_linux_distro.thumb.png.8ababa19bcd1f2433dabfefefd2ab7b1.png"> </a>
</p>

<p style="text-align: center;">
	"شعارات بعض التوزيعات الشهيرة تحيط بشعار نواة لينكس"
</p>

<p>
	سنتحدث في هذه الفقرة عن أكثر توزيعات لينكس شعبية دون الخوض في التفاصيل التقنية، بل سنعتمد مقاربة تستند إلى خبرتك في العمل على الحواسب وطبيعة المهام التي تنوي القيام بها.
</p>

<h3 id="-9">
	توزيعات لينكس للمبتدئين
</h3>

<p>
	غالبًا ما يحتاج القادمون الجدد إلى لينكس بيئة سطح مكتب تشابه ما اعتادوا عليه في ويندوز وماك أو إس، وتدعم الوظائف الأساسية مثل إدارة الملفات وتشغيلها ودعم الاتصال مع الإنترنت. فأن تكون التوزيعة مجانية أمر جيد جدًا، وأن تكون مدعومة على نطاق واسع من قبل الشركة المنتجة لها أو من قبل مجتمعات المطوّرين أمر حيوي أيضًا. فما يحتاجه المبتدئ غالبًا واجهة استخدام سهلة، وتطبيقات تدعم أعماله. هنالك الكثير من التوزيعات التي تُوصف بأنها صديقة للقادمين الجدد نذكر منها:
</p>

<ul>
	<li>
		<a href="https://ubuntu.com" rel="external nofollow">أوبنتو Ubuntu</a>
	</li>
	<li>
		<a href="https://www.linuxmint.com/download.php" rel="external nofollow">لينكس مينت Linux Mint</a>
	</li>
	<li>
		<a href="https://chromeenterprise.google/os/chromeosflex/" rel="external nofollow">كروم أو إس Chrome OS</a>
	</li>
	<li>
		<a href="https://zorin.com/os/download/" rel="external nofollow">زورين أو إس Zorin OS</a>
	</li>
</ul>

<h4 id="-10">
	نظام التشغيل أوبنتو
</h4>

<p>
	تطوّر هذه التوزيعة شركة كانونيكال Canonical وتُعد توزيعة سهلة الاستخدام. تأتي نسخة الحواسب المكتبية منها Desktop Computers مع واجهة رسومية تتمثل ببيئة سطح المكتب "جنوم".
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139847" href="https://academy.hsoub.com/uploads/monthly_2023_12/06_ubuntu_os.png.1746b1225631432d9a57224c7ad0ce7f.png" rel=""><img alt="06 ubuntu os" class="ipsImage ipsImage_thumbnailed" data-fileid="139847" data-unique="u0vlzrmyk" src="https://academy.hsoub.com/uploads/monthly_2023_12/06_ubuntu_os.png.1746b1225631432d9a57224c7ad0ce7f.png"> </a>
</p>

<p style="text-align: center;">
	"سطح المكتب الافتراضي لتوزيعة أبونتو"
</p>

<p>
	لن تجد صعوبة في تعلم العمل مع واجهة أوبنتو، وستجد أنك قادر على إدارة حاسوبك بكل ثقة نظرًا للأسلوب السهل والمباشر في ضبط الإعدادات المختلفة. تأتي توزيعة لينكس أوبونتو مع <a href="https://academy.hsoub.com/apps/productivity/liberoffice/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AD%D8%B2%D9%85%D8%A9-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8-%D8%A7%D9%84%D8%AD%D8%B1-libreoffice-r1/" rel="">مجموعة برمجيات ليبروفس Libreofffice</a> المكتبية التي تضم محرر نصوص متطور يشابه مايكروسوفت وورد وبرنامج تصميم عروض تقديمية وبرنامج جداول إلكترونية وبرمجيات مكتبية أخرى. كما يأتي مع هذه التوزيعة تطبيق Ubuntu Software Center الذي يساعدك على البحث عن تطبيقات وبرامج أخرى وتثبيتها بكل سهولة. أما للاتصال بالإنترنت فيأتي متصفح موزيلا فايرفوكس افتراضيًا مع أوبنتو. يدعم أوبنتو اللغة العربية جيدًا لكن قد تظهر لك بعض القوائم التي لا يُتاح لها ترجمة باللغة العربية. كما قد تواجهك بعض المصاعب كمبتدئ في تثبيت حزم اللغة العربية لعدم وجود نسخ تعتمد العربية افتراضيًا مثل ويندوز.
</p>

<p>
	بُنيت هذه التوزيعة على أساس توزيعة ديبيان Debian لهذا يمكن في معظم الأحيان تثبيت البرمجيات المخصصة لديبيان على أوبونتو. تُعد النسخة المستقرة 22.04 LTD آخر إصدارات أوبنتو، أما "LTS" فهو اختصار لعبارة Long Term Support أو الدعم طويل الأمر كإشارة إلى أن تحديث هذه التوزيعة وصيانتها مستمر لفترة طويلة بعد الإصدار. أوبنتو مجاني للاستخدام الشخصي لكن هناك بعض الخدمات المدفوعة التي تقدمها شركة كانونيكال. وتتميز هذه التوزيعة بدعم كبير من قبل الشركة المطوّرة ومن قبل مجتمعات المطورين والمهتمين.
</p>

<h4 id="-11">
	نظام التشغيل لينكس مينت
</h4>

<p>
	تُعد هذه التوزيعة الخيار الأول للقادمين الجدد إلى عالم لينكس لبساطتها، فغايتها الأساسية تزويد مستخدم لينكس بسطح مكتب كلاسيكي مزوّد بالعديد من الأدوات المخصصة لإدارة الحاسوب والاتصال بالإنترنت ودعم أنواع كثيرة من الوسائط المتعددة. تأتي هذه التوزيعة مع مجموعة البرامج المكتبية ليبرأوفيس ومتصفح فايرفوكس، كما تضم واجهة رسومية لدعم البحث عن البرمجيات وتثبيتها عبر الإنترنت ويمكنها الاتصال بنفس مخازن تطبيقات أوبنتو فهي تدعم معظم برمجياته كونها توزيعة مبنية أساسًا على توزيعة أوبنتو طويلة الدعم. يدعم النظام عدة بيئات سطح مكتب (سينامن Cinnamon، مايت MATE و Xfce) ويمكن أن تختار البيئة الافتراضية قبل تنزيل التوزيعة وتثبيتها. كما يدعم لينكس منت اللغة العربية دعمًا مقبولًا أي قد تجد بعض الصعوبات في تثبيت حزمة اللغة العربية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139848" href="https://academy.hsoub.com/uploads/monthly_2023_12/07_mint_os.png.8676348159ac0d523fe6fa3fd25a738a.png" rel=""><img alt="07 mint os" class="ipsImage ipsImage_thumbnailed" data-fileid="139848" data-unique="s6byywman" src="https://academy.hsoub.com/uploads/monthly_2023_12/07_mint_os.png.8676348159ac0d523fe6fa3fd25a738a.png"> </a>
</p>

<p style="text-align: center;">
	"سطح مكتب توزيعة مينت"
</p>

<h4 id="-12">
	نظام كروم أو إس
</h4>

<p>
	إن كنت ممن يفضلون إنجاز كل مهامهم من خلال الإنترنت فهي توزيعة لينكس المناسبة لك! إذ بُنيت هذه النسخة خصيصًا للعمل من خلال تطبيقات الويب أو عن طريق الخدمات السحابية. طوّرت هذه التوزيعة من قبل Neverware وهي فرع من جوجل الآن، وبنيت على أساس جنتو لينكس Gentoo Linux.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139843" href="https://academy.hsoub.com/uploads/monthly_2023_12/08_chrom_os.png.ecb148232a57af4e96623239b2c37aeb.png" rel=""><img alt="08 chrom os" class="ipsImage ipsImage_thumbnailed" data-fileid="139843" data-unique="w1a8dpbis" src="https://academy.hsoub.com/uploads/monthly_2023_12/08_chrom_os.png.ecb148232a57af4e96623239b2c37aeb.png"> </a>
</p>

<p style="text-align: center;">
	"سطح مكتب توزيعة كروم أو إس"
</p>

<p>
	قد تسمع أن حواسب كروم بوك Chromebook هي من تعمل على نظام كروم أو إس، لكن بإمكانك تحويل أي حاسب شخصي PC أو حاسب ماك ليعمل على كروم أو إس بكل بساطة حتى لو كان قديمًا (حتى للحواسب التي أنتجت من 15 عامًا). فقد طوّرت جوجل النسخة Chrome OS Flex أساسًا لتعيد الحياة إلى الحواسب القديمة التي لم يعد بإمكانها تشغيل النسخ الأحدث من ويندوز أو ماك إلى حواسب كروم بوك فعّالة.
</p>

<p>
	تتميز هذه التوزيعة ببساطتها وقوتها، وستعجبك بالتأكيد إن كنت من معجبي "أندرويد"، فلهما نفس النكهة. عند تسجيل حسابك على جوجل يأخذ كروم أو إس تلقائيًا إعداداته من إعدادات حسابك، فإن كنت تستخدم العربية فستكون واجهة النظام عربية، فلا تقلق من هذه الناحية. تضم التوزيعة متصفح جوجل كروم افتراضيًا ويمكنك استخدام جوجل دوكس لتحرير ملفاتك المكتبية أو الوصول إلى أية برمجيات مكتبية أخرى من جوجل من خلال الإنترنت أو العمل دون اتصال، كما تتاح الكثير من البرمجيات المشابهة عبر الإنترنت مثل "أوفيس 365".
</p>

<h4 id="-13">
	نظام زورين أو إس
</h4>

<p>
	وهي توزيعة بسيطة وخفيفة الحجم من لينكس بنيت على أساس أوبونتو، وتعد الخيار المفضل للمنتقلين من ويندوز ولا يرغبون في تعلم أي شيء عن سطح مكتب جنوم والبيئات التي تشبهه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="139845" href="https://academy.hsoub.com/uploads/monthly_2023_12/09_zorin_os.png.f847cf123247e252a8ec733bd25b916e.png" rel=""><img alt="09 zorin os" class="ipsImage ipsImage_thumbnailed" data-fileid="139845" data-unique="xmx1mzfsz" src="https://academy.hsoub.com/uploads/monthly_2023_12/09_zorin_os.png.f847cf123247e252a8ec733bd25b916e.png"> </a>
</p>

<p style="text-align: center;">
	"سطح مكتب توزيعة زورين"
</p>

<p>
	إذ يمكنك أن تخصص المظهر العام لهذه التوزيعة من خلال تطبيق Zorin Appearance ليبدو كسطح مكتب ويندوز كي يسهل عليك الانتقال إلى بيئة لينكس. تأتي هذه التوزيعة بعدة خيارات أحدها مجاني، ويقدم دعمًا مقبولًا للغة العربية. أحدث إصدارات هذه التوزيعة هي 16.2 وتأتي مع مجموعة ليبر-أوفيس المكتبية ومتصفح فايرفوكس.
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:center;">
				التوزيعة
			</th>
			<th style="text-align:right;">
				مستوى المستخدم
			</th>
			<th style="text-align:right;">
				الأساس
			</th>
			<th style="text-align:right;">
				الواجهة
			</th>
			<th style="text-align:right;">
				حزم البرمجيات المدعومة
			</th>
			<th style="text-align:right;">
				بالعربية
			</th>
			<th style="text-align:right;">
				آخر إصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:center;">
				أوبنتو
			</td>
			<td style="text-align:right;">
				مبتدئ-متقدم
			</td>
			<td style="text-align:right;">
				ديبيان
			</td>
			<td style="text-align:right;">
				رسومية
			</td>
			<td style="text-align:right;">
				DEB, Flatpak, Snap
			</td>
			<td style="text-align:right;">
				نعم
			</td>
			<td style="text-align:right;">
				22.04
			</td>
		</tr>
		<tr>
			<td style="text-align:center;">
				مينت
			</td>
			<td style="text-align:right;">
				مبتدئ
			</td>
			<td style="text-align:right;">
				أوبونتو
			</td>
			<td style="text-align:right;">
				رسومية
			</td>
			<td style="text-align:right;">
				DEB
			</td>
			<td style="text-align:right;">
				نعم
			</td>
			<td style="text-align:right;">
				21.1
			</td>
		</tr>
		<tr>
			<td style="text-align:center;">
				كروم أو إس
			</td>
			<td style="text-align:right;">
				مبتدئ
			</td>
			<td style="text-align:right;">
				جينتو
			</td>
			<td style="text-align:right;">
				رسومية
			</td>
			<td style="text-align:right;">
				SRC
			</td>
			<td style="text-align:right;">
				نعم
			</td>
			<td style="text-align:right;">
				108.0
			</td>
		</tr>
		<tr>
			<td style="text-align:center;">
				زورين أو إس
			</td>
			<td style="text-align:right;">
				مبتدئ
			</td>
			<td style="text-align:right;">
				أوبنتو
			</td>
			<td style="text-align:right;">
				رسومية
			</td>
			<td style="text-align:right;">
				DEB, Flatpak, Snap
			</td>
			<td style="text-align:right;">
				نعم
			</td>
			<td style="text-align:right;">
				16.2
			</td>
		</tr>
	</tbody>
</table>

<h3 id="-14">
	توزيعات لينكس للمستخدمين المتقدمين
</h3>

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

<p>
	عادة ما يكون هؤلاء المستخدمين من التقنيين أو المهتمين بتقنيات الحوسبة أو المشرفين عليها، لهذا سيرغبون في العمل على توزيعات تساعدهم في إنجاز مهام إدارية وتقنية أوسع. ننصح هؤلاء المستخدمين بتجريب إحدى التوزيعات التالية:
</p>

<ul>
	<li>
		<a href="https://www.debian.org/download" rel="external nofollow">ديبيان Debian Linux</a>
	</li>
	<li>
		<a href="https://getfedora.org" rel="external nofollow">فيدورا Fedora Linux</a>
	</li>
	<li>
		<a href="https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux" rel="external nofollow">ريد هات انتربرايز لينكس Read Hat Enterprise Linux</a>
	</li>
	<li>
		<a href="https://www.suse.com" rel="external nofollow">سوسي لينكس Suse Linux</a>
	</li>
</ul>

<h4 id="-15">
	توزيعة ديبيان
</h4>

<p>
	وهي توزيعة مستقرة وآمنة ومجانية مبنية على أساس نواة لينكس مباشرة وبالتالي ستمنح المستخدم المتقدم إمكانيات إدارية أفضل وتحكمًا أفضل عند العمل مع العتاد الصلب. كما يُستخدم أيضًا مع الأنظمة المدمجة وإنترنت الأشياء وللعمل مع التقنيات السحابية. تمتاز هذه التوزيعة بوجود كم هائل من البرمجيات المتوافقة معها (حزم من النوع <code>deb.</code>)، وتمتلك مجتمعًا ضخمًا من المناصرين والمهتمين.
</p>

<h4 id="-16">
	توزيعة فيدورا
</h4>

<p>
	وهي توزيعة قوية موجّه للمستخدمين المتقدمين والمطوّرين كونها في طليعة التوزيعات التي تواكب آخر التقنيات. بنيت هذه التوزيعة على أساس نواة لينكس وتأتي وفق توزيعات مختلفة منها "Workstation" للحواسب المكتبية والمحمولة وتضم أدوات متكاملة لتطوير البرمجيات وتحزيمها إضافة إلى تقديمها بيئة سطح مكتب ممتازة (سطح مكتب جنوم افتراضيًا). أما بقية النسخ فهي مخصصة لأغراض أكثر تقدمًا كنسخة الحوسبة السحابية fedora cloud ونسخة إنترنت الأشياء fedora IoT وغيرها.
</p>

<h4 id="rhel">
	توزيعة ريد هات إنتربرايز لينكس RHEL
</h4>

<p>
	توزيعة شهيرة وموثوقة من لينكس ترعاها شركة (ريد هات Red Hat) وهي مبنية أساسًا على نواة لينكس لكن ما يجري حاليًا أنها تعتمد على توزيعة فيدورا لتطوير نفسها بتقنيات جديدة موثوقة. فتوزيعة فيدورا هي توزيعة مجانية ترعاها شركة "ريد هات" لكن من يطوّرها هو مجتمعات المطورين والمهتمين، فما يجري من تحديثات على فيدورا تنتقل بعد المراجعة والاختبار لتكون جزءًا من ريد هات إنتربرايز لينكس. لتوزيعة RHEL عدة إصدارات، كما بُنيت عليها توزيعات أخرى، فهي مفتوحة المصدر لكنها غير مجانية.
</p>

<h4 id="-17">
	توزيعة سوسي لينكس
</h4>

<p>
	توزيعة مبنية على نواة لينكس وتأتي وفق عدة إصدارات منها لإدارة الحواسب المكتبية والمحمولة SUSE Linux Enterprise Server وأخرى لإدارة الخوادم SUSE Linux Enterprise Desktop ونسخ أخرى للحوسبة السحابية والحوسبة الحدية مثل SUSE Linux Enterprise Micro. هذه النسخ غير مجانية لكنها في المقابل أرخص بكثير من إصدارات ويندوز أو ماك أو إس. ستجد أيضًا النسخة openSuse المجانية والمفتوحة المصدر، وتأتي لحواسب سطح المكتب وفق أحد إصدارين هما Leap والآخر Tumbleweed.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		هنالك توزيعات أخرى مخصصة للمطورين والخبراء لم نأتي على ذكرها مثل Gentoo و Kali
	</p>
</blockquote>

<h2 id="-18">
	لماذا لينكس؟
</h2>

<p>
	عمدت قاصدًا أن أتأخر في الحديث عن فوائد استخدام لينكس حتى هذه اللحظة، حتى يتسنى لك الاطلاع على ماهية نظام لينكس وما هي قصة التوزيعات المختلفة الكثيرة جدًا وفلسفة تطوير كل منها ومن يطوّرها ولمن تُوجّه.
</p>

<p>
	دعنا نناقش الأمر بكل بساطة وعملانية، ما الذي يدفعني كمستثمر عادي للانتقال إلى لينكس؟
</p>

<ol>
	<li>
		<strong>نظام تشغيل مجاني</strong>: هنالك الكثير من التوزيعات الشهيرة مجانية تمامًا لأن من يطوّرها ويطوّر برمجياتها مجتمع من المهتمين من ذوي الخبرة والممارسة. فلماذا على أن أدفع ثمن نظام تشغيل إن كانت هناك أنظمة أخرى عملية ومجانية؟
	</li>
	<li>
		<strong>آمن نسبيًا</strong>: لن يكون جهازك عرضة للبرمجيات الضارة والفيروسات دائمًا كما هو الحال في أنظمة ويندوز وماك وبالتالي لن تحتاج بالضرورة إلى برامج حماية. لا يعني هذا أنك محصّن تمامًا لكن احتمال أن تتعرض إلى برمجيات ضارة ضعيف.
	</li>
	<li>
		<strong>واجهة مستخدم رسومية</strong>: رأينا أن معظم التوزيعات التي تكلمنا عنها سابقًا تأتي مع بيئة سطح مكتب رسومية لتسهل عليك التعامل مع حاسوبك وهذه البيئات لا تقل فعالية وجمالًا وأناقة عن مثيلاتها في ويندوز وماك.
	</li>
	<li>
		<strong>برامج وتطبيقات مجانية</strong>: تستطيع أن تجد كمًا كبيرًا من البرمجيات المجانية تغطي كل احتياجاتك من البرمجيات المكتبية إلى مشغلات الوسائط المتعددة إلى برامج الرسوميات دون أن تدفع أي مقابل.
	</li>
	<li>
		<strong>توزيعات خفيفة</strong>: توقفت مايكروسوفت وماك عن دعم الأنظمة القديمة، ولن تستطيع الأجهزة القديمة التي لا تزال صالحة للعمل تشغيل النسخ الأحدث من أنظمة التشغيل تلك لأنها تتطلب مواصفات أعلى بكثير. يقدّم لينكس هنا حلًا رائعًا بتوفيره توزيعات عصرية لكنها خفيفة تستطيع أن تعمل على الأجهزة القديمة دون مشاكل تذكر.
	</li>
</ol>

<p>
	لم أذكر بالطبع فوائد العمل على لينكس للتقنيين والمطورين والمبرمجين لأنهم يدركون جيّدًا فائدة ذلك، ويعلمون أن التقنيات مفتوحة المصدر أثبتت فعاليتها في تطوّر صناعة البرمجيات لهذا تجد أن شركات مثل مايكروسوفت وجوجل بدأت بدعم هذه التقنية ودعم البرمجيات متعددة المنصات (التي تعمل على عدة أنظمة تشغيل) لأسباب عديدة تخرج عن إطار هذا المقال.
</p>

<h2 id="-19">
	أسئلة شائعة عن لينكس
</h2>

<p>
	سنحاول تاليًا أن نكمل بعض الأفكار ونلخص بعضها وفق أسلوب الأسئلة والأجوبة كي لا نتعمق في التفاصيل.
</p>

<ul>
	<li>
		<strong>هل لينكس مجاني؟</strong> ليست كل التوزيعات، لكنك تستطيع الحصول على الكثير من التوزيعات القوية والمستقرة مجانًا.
	</li>
	<li>
		<strong>هل هناك نظام تشغيل يُدعى لينكس يمكنني تثبيته على حاسوبي؟</strong> عمومًا لا. لينكس هو نواة تُبنى على أساسها توزيعات (أنظمة تشغيل) يمكنك تثبيت أي منها واستثمارها.
	</li>
	<li>
		<strong>هل لينكس هو نفسه يونكس؟</strong> لا، لكن نظام التشغيل لينكس هو نظام مشابه لنظام يونكس UNIX-like ومشتق منه.
	</li>
	<li>
		<strong>هل يمكن لأي شخص استخدام لينكس؟</strong> بالتأكيد، أيًا تكن خبرته في العمل على الحاسوب.
	</li>
	<li>
		<strong>هل تعلّم لينكس صعب؟</strong> لا بكل تأكيد وخاصة عند تثبيت توزيعات صديقة للمبتدئين.
	</li>
	<li>
		<strong>هل تعمل تطبيقات لينكس على جميع التوزيعات؟</strong> ليس بالضرورة. تأتي التطبيقات ضمن حزم برمجية مختلفة. فإن دعمت توزيعتان نفس الحزمة سيعمل التطبيق على كل منهما. وعادة ما يمكن للتوزيعة تشغيل التطبيقات التي تشغّلها التوزيعة التي اشتُقت منها.
	</li>
	<li>
		<strong>هل يمكنني إيجاد معظم البرامج التي أحتاجها إن استخدمت لينكس؟</strong> بكل تأكيد، والكثير منها مجاني.
	</li>
	<li>
		<strong>هل يمكنني تشغيل تطبيقات ويندوز على لينكس والعكس؟</strong> نعم لكن من خلال برمجيات مخصصة تثبتها على نظام التشغيل المضيف لتشغّل برامج النظام الضيف.
	</li>
	<li>
		<strong>هل تثبيت البرامج صعب على لينكس؟</strong> نوعًا ما، فعلى الرغم من توفّر برمجيات تأتي افتراضيًا مع توزيعات لينكس لتساعدك في البحث عن البرامج التي تحتاجها وتثبيتها، إلا أن المشاكل قد تحدث.
	</li>
	<li>
		<strong>هل تثبيت لينكس صعب؟</strong> غالبًا ما تكون العملية أسهل من تثبيت البرمجيات عليه وخاصة في التوزيعات المهيأة للإقلاع من بطاقة ذاكرة أو قرص USB. تثبت هذه الإصدارات النظام دون أي تدخل منك إلا ما ندر.
	</li>
	<li>
		<strong>هل يمكنني تثبيت لينكس مع ويندوز؟</strong> نعم تتيح لك عدة توزيعات هذا الأمر مثل أوبونتو، ويمكنك عند إقلاع الحاسب اختيار نظام التشغيل الذي تريد العمل عليه.
	</li>
	<li>
		<strong>هل يتعرف لينكس على أي جهاز يتصل به تلقائيًا دون تعريفات drivers؟</strong> تدعم التوزيعات الشهيرة معظم أنواع العتاد الصلب ولن تحتاج عادة إلى أي برمجيات إضافية أو تعريفات. لكن لا بأس أن تطلع على كُتيّب المستخدم أو على صفحة المُنتَج على الإنترنت لتفاصيل أكثر.
	</li>
	<li>
		<strong>هل علي كتابة أوامر دائمًا عند العمل على لينكس؟</strong> ليس بالضرورة، فالكثير من التوزيعات تأتي مع واجهة رسومية تتيح لك التعامل مع نوافذ وقوائم وأزرار. لكنك سترى أن تعلم الأوامر أمر مهم جدًا في مرحلة ما من رحلتك.
	</li>
	<li>
		<strong>ما هي توزيعة لينكس المناسبة لمبتدئ؟</strong> أنصح بتوزيعة لينكس مينت أو زورين أو أبونتو.
	</li>
</ul>

<h2 id="-20">
	خاتمة
</h2>

<p>
	يزداد عدد مستخدمي توزيعات لينكس المختلفة كثيرًا على تنوع خبراتهم وغاياتهم، وتثبت هذه التوزيعات قوتها وفعاليتها العالية في شتى مجالات الحوسبة من الحواسب الشخصية إلى الخوادم إلى التقنيات السحابية إلى الأنظمة المدمجة وإنترنت الأشياء. ومع تطوّر بيئات سطح المكتب التي تأتي مع مختلف التوزيعات ازدادت شعبية توزيعات لينكس بين المستخدمين العاديين وخاصة أن الكثير منها مجاني، ولم تُعد هناك فروق تلحظ مع الأنظمة الشهيرة المدفوعة مثل ويندوز وماك. لهذا حاولنا في هذا المقال الإحاطة بالأفكار الأساسية التي ينبغي لأي قادم جديد إلى عالم لينكس معرفتها وأجبنا عن الكثير من الأسئلة التي تقلقهم حتى يكون انتقالهم بسيطًا وسهلًا ودون مشاكل تذكر.
</p>

<h2 id="-21">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D9%88%D8%AC%D8%AF-100-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%85%D9%86%D9%87%D8%9F-r698/" rel="">ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A3%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-r784/" rel="">تثبيت البرمجيات في أبونتو عبر الواجهة الرسومية</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r779/" rel="">تعرف على سطح مكتب أوبونتو 20.04</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r780/" rel="">التعامل مع المجلدات والملفات في أوبونتو </a><a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r780/" rel="">20.04</a>
	</li>
	<li>
		النسخة الكاملة لكتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">799</guid><pubDate>Sun, 10 Dec 2023 17:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x627;&#x644;&#x62D;&#x632;&#x645; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x62E;&#x627;&#x632;&#x646; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62E;&#x627;&#x631;&#x62C;&#x64A;&#x629; &#x636;&#x645;&#x646; &#x623;&#x628;&#x648;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D8%AE%D8%A7%D8%B2%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AE%D8%A7%D8%B1%D8%AC%D9%8A%D8%A9-%D8%B6%D9%85%D9%86-%D8%A3%D8%A8%D9%88%D9%86%D8%AA%D9%88-r795/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_09/----------.png.8282c3e231727e109aa552530abc48d0.png" /></p>
<p>
	يثبت مستخدمي لينكس الكثير من الحزم البرمجية باستخدام <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-apt-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r785/" rel="">الأداة apt</a> لما تتيحه من سهولة في العمل، فيكفي أن يكتب المستخدم اسم الحزمة لتبدأ الأداة البحث عنها ضمن مخازن البرمجيات الخاصة بنظام التشغيل أوبونتو.
</p>

<p>
	تكمن المشكلة الأساسية عندما لا تكون الحزمة المطلوبة موجودة ضمن مخزن البرمجيات الخاص بنظام التشغيل أوبونتو وهنا يمكن للمستخدم أن يستخدم برمجيات خارجية -مطورة من طرف ثالث Third-party كما تسمى- إن رغب بذلك كما هو الحال عند تثبيت التطبيقات باستخدام PPA ويمكن أن يتم اللجوء إلى مخزن برمجيات خارجي وتوسعة قائمة مصادر التثبيت Source List المستخدمة عند البحث عن حزمة برمجية ما.
</p>

<p>
	يبحث المستخدم عادة عن التعليمات اللازمة لتثبيت الحزمة فيجد مجموعة من الأوامر التي يجب عليه تنفيذها كأن يثبّت أداة ما ومن إضافة شيء ما يتعلق بمفاتيح gpg إلى قائمة مصادر التثبيت وبعدها يمكن تثبيت الحزمة البرمجية. يستعرض المثال التالي التعليمات اللازمة لتثبيت مدير الحزم الخاص بلغة جافا سكريبت JavaScript على نظام أوبونتو:
</p>

<pre class="ipsCode">sudo apt install apt-transport-https curl
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" &gt;&gt; /etc/apt/sources.list.d/yarn.list'
sudo apt update &amp;&amp; sudo apt install yarn
</pre>

<p>
	نجد العديد من هذه الأوامر عند تثبيت الأدوات البرمجية مباشرة من المطور وتعد المشكلة الأساسية فيها أن المستخدم ينفذ مجموعة من التعليمات الحساسة والتي تتطلب صلاحيات متقدمة بعض الشيء دون أن يدرك فعليًا دور كل أمر من الأوامر. يجب أن يدرك المستخدم الخطوات التي ينفذها مما يضمن نجاح عملية التثبيت من جهة ويسهل عملية حل المشاكل التي تصادفه.
</p>

<h2>
	فهم إجرائية تثبيت الحزم من مخازن البرمجيات الخارجية
</h2>

<p>
	يبين الشكل التالي توضيحًا للمخازن البرمجية ومحتوياتها ضمن نظام التشغيل لينكس.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_09/linux-package-manager-explanation.png.3b0c21939ddf9fec915402ccb97a2d27.png" data-fileid="135517" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="135517" data-unique="19dcqk2mt" alt="linux-package-manager-explanation.png" src="https://academy.hsoub.com/uploads/monthly_2023_09/linux-package-manager-explanation.png.3b0c21939ddf9fec915402ccb97a2d27.png"> </a>
</p>

<p>
	عندما نضيف مخزن برمجيات جديد إلى النظام فهذا يعني أن المستخدم يصبح قادرًا على تحميل وتثبيت الحزم البرمجية المتاحة ضمن هذا المخزن الجديد كما أنه يستطيع تحديث وترقية هذه الحزم عندما يتيحها المخزن مباشرة وذلك من ضمن عملية تحديث وترقية حزم النظام بتنفيذ الأمر <code>apt update</code> والأمر <code>apt upgrade</code>.
</p>

<p>
	تقسم هذه الإجرائية إلى أربعة أجزاء رئيسية وهي:
</p>

<ol>
	<li>
		الحصول على دعم بروتوكول https للأداة apt
	</li>
	<li>
		إضافة مفتاح GPG الخاص بمخزن البرمجيات البعيد
	</li>
	<li>
		إضافة عنوان مخزن البرمجيات البعيد إلى قائمة مصادر التثبيت الموثوقة
	</li>
	<li>
		تثبيت التطبيقات من المخزن البرمجي الذي تمت إضافته
	</li>
</ol>

<h3>
	الجزء الأول: الحصول على دعم بروتوكول https للأداة apt
</h3>

<p>
	بالعودة إلى التعليمات السابقة نجد أنها تبدأ بالأمر التالي:
</p>

<pre class="ipsCode">sudo apt install apt-transport-https curl
</pre>

<p>
	تستخدم الأداة Curl لتحميل الملفات باستخدام <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">سطر أوامر لينكس</a>، أما الحزمة الثانية التي يتم تثبيتها فهي الأهم إذا كانت توزيعة لينكس المستخدمة قديمة بعض الشيء أما إذا كانت التوزيعة حديثة فلا داع لتنفيذ هذا الأمر.
</p>

<p>
	تُستخدم هذه الأداة لإجبار نظام تشغيل أوبونتو لاستخدام https بدلًا من http التي تعد البروتوكول الافتراضي. حتى أن دعم https لم يكن أساسيًا وذلك قبل الإصدار 1.5 من الأداة apt وأما بعد هذا الإصدار فلا يوجد داع لتثبيت الحزمة السابقة لأنها أصبحت مدمجة بشكل تلقائي في الأداة.
</p>

<p>
	يبين الشكل أدناه أنّ مخازن برمجيات أوبونتو تستخدم البروتوكول http إلا بعضًا منها التي أضافها المستخدم بشكل يدوي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_09/apt-update-http-https.png.180df216a1d0a4028912e691c609fd7e.png" data-fileid="135518" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="135518" data-unique="6jrc7ll3v" alt="apt-update-http-https.png" src="https://academy.hsoub.com/uploads/monthly_2023_09/apt-update-http-https.png.180df216a1d0a4028912e691c609fd7e.png"> </a>
</p>

<p>
	إذا تضيف الحزمة "apt-transport-https" دعم https إلى الأداة apt ومن الطبيعي أن يتساءل المستخدم عن سبب غياب دعم بروتوكول https بشكل مباشر من قبل نظام أوبونتو علمًا أنه أكثر أمانًا من استخدام البروتوكول http وتجيب الفقرة التالية على هذا التساؤل.
</p>

<h3>
	الجزء الثاني: إضافة مفتاح GPG الخاص بمخزن البرمجيات البعيد
</h3>

<p>
	تستخدم مخازن برمجيات لينكس آلية حماية تعتمد على مفاتيح GPG المبنية ضمن مخزن البرمجيات. يضيف كل مخزن مفتاحه إلى قائمة المفاتيح الموثوقة الخاصة بمخازن البرمجيات. يتم توقيع الحزم البرمجية باستخدام هذا المفتاح وعند تثبيتها يتم التحقق من مطابقة المفتاح المخزّن لدى نظام التشغيل مع المفتاح المستخدم في عملية التوقيع للتحقق من أن الحزمة قد تم تثبيتها من المخزن البرمجي الصحيح. يظهر خطأ في حال فشل عملية التحقق ولا يثبت النظام الحزمة الجديدة أو لا يحدثها قبل ضمان نجاح عملية التحقق.
</p>

<p>
	نضيف في الخطوة التالية مفتاح GPG الخاص بالمخزن البرمجي البعيد إلى قائمة المفاتيح الموثوقة ضمن <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس</a> لكي يصبح قادرًا على الوثوق بالحزم البرمجية القادمة من ذلك المخزن وذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
</pre>

<p>
	يحمل الأمر السابق مفتاح GPG من الرابط الذي تمت إضافته، تفيد الراية <code>sS</code> إلى تفعيل النمط الصامت Silent mode حيث لا تظهر على الشاشة المعلومات التي يتم تبادلها أثناء عملية التحميل وتظهر منها الأخطاء فقط. يجب الانتباه إلى وجود الشريطة <code>-</code> في نهاية الأمر فهي المسؤولة على توجيه ما يتم تنزيله في الجزء الأول من الأمر إلى استدعاء الأداة <code>apt-key</code> في الأمر الثاني بدلًا من حفظه كملف. أي تتم إضافة المفتاح بشكل مباشر إلى النظام عبر تنفيذ الأمر <code>apt-key add</code>. يمكن استعراض مفاتيح GPG الخاصة بمخازن البرمجيات مختلفة ضمن نظام التشغيل باستخدام الأمر <code>apt-key list</code> فيظهر خرج مشابه لما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_09/list-apt-key-gpg-ubuntu-1536x1049.png.8de35f2d6e0c64cc99a4642715959c14.png" data-fileid="135516" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="135516" data-unique="wztlnryc7" alt="list-apt-key-gpg-ubuntu-1536x1049.png" src="https://academy.hsoub.com/uploads/monthly_2023_09/list-apt-key-gpg-ubuntu-1536x1049.png.8de35f2d6e0c64cc99a4642715959c14.png"> </a>
</p>

<p>
	توجد عدة طرق أخرى يمكن استخدامها لإضافة مفاتيح GPG أيضًا كما في الشكل التالي:
</p>

<pre class="ipsCode">sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
</pre>

<p>
	يمكن أن يظهر تحذير بأن الأداة <code>apt-key</code> أصبحت قديمة وأنها لن تكون مدعومة بدءًا من الإصدار 22.04 الخاص بتوزيعة أوبونتو ويمكن تجاهل هذا التحذير.
</p>

<h3>
	الجزء الثالث: إضافة عنوان مخزن البرمجيات البعيد إلى قائمة مصادر التثبيت الموثوقة
</h3>

<p>
	يضيف الأمر التالي مُدخلًا جديدًا خاصًا بالمخزن الجديد إلى قائمة مصادر التثبيت الموثوقة من قبل نظام التشغيل، وبالتالي يتحقق نظام التشغيل من هذا المخزن عند الحاجة إلى تثبيت حزم جديدة أو تحديث وترقية الحزم القديمة.
</p>

<pre class="ipsCode">sudo sh -c 'echo "deb https://dl.yarnpkg.com/debian/ stable main" &gt;&gt; /etc/apt/sources.list.d/yarn.list'
</pre>

<p>
	يتضمن الملف ‎/etc/apt/sources.list قائمة بعناوين مخازن البرمجيات الخاصة بنظام أوبونتو ويجب على المستخدم ألا يعدل هذا الملف نهائيًا وإنما يجب إنشاء ملف جديد على أن يكون له اللاحقة .list وتخزينه ضمن المجلد ‎/etc/apt/source.list.d كما في الشكل أدناه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_09/sources-list-ubuntu.png.551b28d3e086dc0a947b78bfdce0a484.png" data-fileid="135515" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="135515" data-unique="fsa2t211e" alt="sources-list-ubuntu.png" src="https://academy.hsoub.com/uploads/monthly_2023_09/sources-list-ubuntu.png.551b28d3e086dc0a947b78bfdce0a484.png"> </a>
</p>

<p>
	تسهل هذه الإضافة عملية إدارة الحزم إذ يكفي عند الرغبة بإزالة مخزن ما من قائمة المصادر الموثوقة أن يتم حذف الملف الموافق من المجلّد السابق وبالتأكيد دون أن يتم تعديل الملف sources.list.
</p>

<p>
	بالعودة إلى الأمر السابق، يفيد استخدام <code>sh</code> إلى تشغيل الأمر ضمن نافذة جديدة من <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">الصدفة shell</a>. تفيد إضافة الراية <code>‎-c</code> لتوجيه الأمر sh إلى قراء الأوامر من المعامل الذي يلي الراية <code>‎-c</code> بدلاً من مدخلات المستخدم ومن ثم تتم إضافة السطر التالي:
</p>

<pre class="ipsCode">deb https://dl.yarnpkg.com/debian/ stable main
</pre>

<p>
	باستخدام تعليمة <code>echo</code> إلى الملف ‎/etc/apt/sources.list.d/yarn.list الذي يتم إنشاؤه.
</p>

<p>
	توجد العديد من الطرق لتنفيذ عملية الإضافة السابقة أيضًا فيمكن الحصول على نفس النتيجة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
</pre>

<h3>
	الجزء الرابع: تثبيت التطبيقات من المخزن البرمجي الذي تمت إضافته
</h3>

<p>
	على الرغم من إضافة مفتاح GPG وعنوان المخزن البرمجي إلا أنّ نظام التشغيل لم يتعرّف على الحزم البرمجية الموجودة لدى هذا المخزن، لهذا يجب تحديث الذاكرة المخبئية cache الخاصة بالأداة apt للتعرف على الحزم البرمجية المتاحة وإصداراتها وذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt update
</pre>

<p>
	يمكن البدء بتثبيت الحزم البرمجية بعد انتهاء تنفيذ الأمر السابق وعليه ننفذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt install yarn
</pre>

<p>
	يمكن لتوفير الوقت أن يتم دمج الأمرين معًا بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt update &amp;&amp; sudo apt install yarn
</pre>

<p>
	يضمن استخدام <code>&amp;&amp;</code> أنّ الأمر الثاني لن ينفّذ قبل انتهاء تنفيذ الأمر الأول دون وجود أخطاء، وبهذا تكون قد اكتملت الإجرائية.
</p>

<h2>
	الخلاصة
</h2>

<p>
	يضطر معظم مستخدمي لينكس إلى إضافة مصادر تثبيت برمجيات إضافية، لهذا يجب إتقان كيفية إضافة هذه المصادر بشكل آمن إلى قائمة المصادر الموثوقة من قبل نظام التشغيل. تضمن هذا المقال تعريفًا بكيفية إضافة عنوان مخزن برمجي إلى المخازن الموثوقة من قبل نظام التشغيل المستخدم.كما تضمن مثالًا عمليًا لتثبيت حزمة برمجية غير موجودة ضمن مخازن البرمجيات الأساسية الخاصة بنظام تشغيل أوبونتو
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://itsfoss.com/adding-external-repositories-ubuntu/" rel="external nofollow">Installing Packages From External Repositories in Ubuntu [Explained]</a> لصاحبه Abhishek Prakash.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r248/" rel="">أساسيات إدارة الحزم في أوبنتو ودبيان</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">أساسيات إدارة الحزم: apt ،yum ،dnf ،pkg</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/10-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D9%8A%D8%AF%D8%A9-%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%B1%D8%A8%D9%85%D8%A7-%D9%84%D9%85-%D8%AA%D8%B3%D9%85%D8%B9-%D8%B9%D9%86%D9%87%D8%A7-%D9%85%D9%86-%D9%82%D8%A8%D9%84-r237/" rel="">10 أدوات مفيدة لمستخدمي لينكس ربما لم تسمع عنها من قبل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">795</guid><pubDate>Fri, 15 Sep 2023 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x643;&#x627;&#x645;&#x644; &#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x623;&#x648;&#x627;&#x645;&#x631; apt &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-apt-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r785/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_07/-----apt---.png.a1e4a84f04f302bc90eacd784002fb14.png" /></p>
<p>
	يتعامل مستخدمي توزيعة ديبيان Debian وأوبونتو Ubuntu ومينت Mint وجميع مستخدمي توزيعات لينكس المعتمدة على أوبونتو أو ديبيان مع أوامر apt لتثبيت الحزم البرمجية المختلفة. نلاحظ بسهولة أنه ومنذ انطلاقة أوبونتو 16.04 قد شاع استخدام الأمر apt بشكل كبير إضافة إلى التوصية باستخدامها كمدير الحزم البرمجية ضمن نظام لينكس.
</p>

<p>
	يتضمن هذا المقال تعريفًا للراغبين بإتقان استخدام نظام لينكس وأدواته المختلفة وتحديدًا أداة تثبيت الحزم البرمجية والتي يضطر جميع المستخدمين الى التعامل معها عاجلًا أم آجلًا.
</p>

<h2>
	ما هي الأداة apt؟
</h2>

<p>
	تمتلك كل توزيعة لينكس <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r248/" rel="">نظام تحزيم packaging system</a> خاص بها والذي يتيح التطبيقات والبرامج ليثبتها المستخدم على نظام التشغيل. لا يحتاج المستخدم في كل مرة أن يبني البرنامج انطلاقًا من شيفرة المصدر. تستخدم <a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AE%D8%AA%D9%84%D9%81-ubuntu-%D8%B9%D9%86-debian%D8%9F-r235/" rel="">توزيعة ديبيان</a> نظام تحزيم اسمه dpkg ويمكن للمستخدم الاعتماد على أداة موجه الأوامر APT وهي اختصار للعبارة Advanced Package Tool للتفاعل مع نظام التحزيم الخاص بتوزيعات لينكس المبنية على أساس ديبيان.
</p>

<p>
	يمكن استخدام الأمر <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-%D8%B9%D9%84%D9%89-%D9%86%D8%B3%D8%AE%D8%A9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D9%85%D9%86-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r156/" rel="">dpkg</a> مباشرة ولكن يتيح الأمر <code>apt</code> المزيد من الخيارات مثل البحث عن الحزم الجديدة وترقيتها وإزالتها إضافة إلى أنها أكثر ملائمة للمستخدمين. يمكن استخدام الأوامر الخاصة بالأداة APT عن طريق تنفيذ الأمر <code>apt</code> في موجه الأوامر.
</p>

<p>
	نجد في العديد من المقالات والمراجع استخدام الأمر <code>apt-get</code> بدلًا من <code>apt</code> وذلك لتثبيت الحزم. شاع استخدام الأمر الأول لفترة طويلة من الزمن إلا أنّ الأمر الثاني قد حل مكانه بسبب بساطته وفعاليته في تنفيذ عمليات تثبيت الحزم.
</p>

<h2>
	تحديث قاعدة بيانات الحزم باستخدام apt
</h2>

<p>
	نستخدم في هذا المقال توزيعة أوبونتو 16.04 ولكن يمكن استخدام أية <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B1%D8%B6-%D9%85%D9%88%D8%AC%D8%B2-%D9%84%D8%A3%D8%B4%D9%87%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r631/" rel="">توزيعة لينكس</a> معتمدة على أوبونتو أو ديبيان مثل مينت Mint و لايت Lite وغيرها.
</p>

<p>
	تستخدم الأداة apt قاعدة بيانات تتضمن الحزم المتاحة وفي حال عدم تحديث محتوى قاعدة البيانات هذه بشكل دوري فلن تعرف الأداة بأنّ إصدارات حديثة من الحزم أصبحت متاحة ولهذا يجب أن نبدأ العمل أولًا بتحديث قاعدة البيانات هذه بعد تثبيت نظام التشغيل لينكس لأول مرة.
</p>

<p>
	يتطلب هذا التحديث استخدام مستخدم ذي صلاحيات مناسبة Superuser ولهذا نستفيد من الأمر <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-permissions-r25/" rel="">sudo</a> بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt update
</pre>

<p>
	يظهر بعد تنفيذ هذا الأمر معلومات الحزم المتاحة والتي يتم الحصول عليها من عدة خوادم موزعة على أماكن جغرافية متعددة كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-2.png.68f975119b625b0d83e0e53c75da463d.png" data-fileid="130756" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130756" data-unique="d1uuzq50w" alt="apt-commands-examples-2.png" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-2.png.68f975119b625b0d83e0e53c75da463d.png"> </a>
</p>

<p>
	نلاحظ من الشكل السابق أن معظم الأسطر التي تتعلق بالاتصال بالخوادم تبدأ بأحد الاحتمالات التالية:
</p>

<ul>
	<li>
		الإصابة Hit: يشير إلى أنّه لا يوجد تعديل بنسخة الحزمة الموجودة لدى الخادم والنسخة المثبتة على الحاسب
	</li>
	<li>
		التجاهل Ign: يشير إلى أنّه يجب تجاهل هذا التحديث إما لأنه لا يزال حديثًا وبالتالي يتم تأجيل تنفيذ هذا التحديث حتى يثبت استقرار التحديث الجديد أو أنه قد حدث خطأ ما أثناء طلب التحديث ولكن لا يمثّل هذا الخطأ خطورة ويمكن تجاهله.
	</li>
	<li>
		الجلب Get: يشير إلى أنّه تم اكتشاف إصدار أحدث وسيتم تنزيل المعلومات عن الحزم لكي يتم تثبيتها لاحقًا ويظهر في آخر السطر حجم المعلومات التي يتم تحميلها.
	</li>
</ul>

<h2>
	ترقية الحزم المثبّتة باستخدام الأداة apt
</h2>

<p>
	يمكن بعد تحديث قاعدة بيانات الحزم البدء بترقية الحزم المثبّتة على الحاسب، من المفضل أن تتم هذه الترقية بشكل دوري لجميع الحزم نظرًا لأن عمليات الترقية تحدث لحل مشاكل برمجية معينة أو لتحسين الأداء. نبدأ عملية الترقية باستخدام الأمر:
</p>

<pre class="ipsCode">sudo apt upgrade
</pre>

<p>
	تظهر بعدها معلومات عن الحزم التي سيتم ترقيتها من حيث عدد هذه الحزم والحجم الكلي الذي سيتم تحميله من الإنترنت وكم يبلغ الحجم الإضافي الذي سيتم استهلاكه من الحاسب كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-3.png.32429792d980242208326dc77a8403ea.png" data-fileid="130755" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130755" data-unique="4syswj9aj" alt="apt-commands-examples-3.png" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-3.png.32429792d980242208326dc77a8403ea.png"> </a>
</p>

<p>
	يمكن أيضًا أن تتم عملية الترقية للحزم بتنفيذ أمر آخر على الشكل التالي:
</p>

<pre class="ipsCode">sudo apt full-upgrade
</pre>

<p>
	يعمل هذا الأمر كسابقه إلا أنّه يثبت التحديثات المتعلّقة بترقية النظام والتي تتطلب إزالة حزمة موجودة على نظام التشغيل أما الأمر السابق فلا يستطيع تنفيذ مثل هذه العملية.
</p>

<h3>
	ما الاختلاف بين الأمر apt update والأمر apt upgrade؟
</h3>

<p>
	يجب التذكر دومًا أنّ الأمر <code>apt update</code> يحدّث قاعدة بيانات الحزم فقط ولا يرقّي الحزم فعليًا. لنفرض أنه توجد حزمة مثبّتة على الحاسب الشخصي اسمها XYZ وكان الإصدار المثبت 1.3 فبعد تنفيذ الأمر apt update يتم تحديث قاعدة البيانات لتشير إلى الإصدار 1.4 المتاح للتثبيت، يمكن عندها تنفيذ الأمر apt upgrade لترقية الحزمة المطلوبة للإصدار الأحدث.
</p>

<p>
	يمكن دمج هذين الأمرين لتسريع هذه العملية بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt update &amp;&amp; sudo apt upgrade -y
</pre>

<h2>
	تثبيت الحزم الجديدة باستخدام الأداة apt
</h2>

<p>
	يستخدم الأمر لتثبيت الحزم الجديدة التي يحتاجها المستخدم في عمله بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt install &lt;package_name&gt;
</pre>

<p>
	نضيف اسم الحزمة المطلوبة بدلًا من <package_name> فعلى سبيل المثال يمكن من أجل تثبيت الحزمة mplayer تنفيذ الأمر التالي:</package_name>
</p>

<pre class="ipsCode">sudo apt install mplayer
</pre>

<p>
	يظهر عندها خرج مشابه للشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-4.png.bb20a1e55e49965145e78a53c9719ebb.png" data-fileid="130754" data-fileext="png" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130754" data-unique="ddc0we557" alt="apt-commands-examples-4.png" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-4.png.bb20a1e55e49965145e78a53c9719ebb.png"> </a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-5.PNG.df2ed2ed9ac64761fc46007cfbb53ee7.PNG" data-fileid="130753" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130753" data-ratio="18.39" data-unique="u5pl546s3" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-5.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-5.thumb.PNG.d98cedb446f7b037b8a5791225dc21a5.PNG"> </a>
</p>

<h2>
	تثبيت عدة حزم معًا باستخدام الأداة apt
</h2>

<p>
	يمكن تثبيت دفعة من الحزم معًا وذلك في حال كان عدد الحزم المطلوبة للتثبيت كبيرًا فمن غير المجدي أن يتم تثبيتها واحدة تلو الأخرى. يتم ذكر اسم الحزم بشكل متتالي بحيث يفصل بينها فراغ واحد كما في الشكل التالي:
</p>

<pre class="ipsCode">sudo apt install &lt;package_1&gt; &lt;package_2&gt; &lt;package_3&gt;
</pre>

<h3>
	تنفيذ الأمر apt على حزمة مثبّتة بشكل مسبق
</h3>

<p>
	يتم في هذه الحالة ترقية هذه الحزمة في حال وجود إصدار أحدث ضمن قاعدة البيانات ولا يسبب ذلك أية مشكلة إلا في حال عدم رغبة المستخدم أن يرقّي الحزمة لسبب ما.
</p>

<h3>
	تثبيت الحزم دون تنفيذ عملية الترقية
</h3>

<p>
	يمكن تثبيت حزمة ما دون الحاجة إلى تنفيذ أمر الترقية في حال رغب المستخدم بذلك عبر إضافة الخيار <code>‎--no-upgrade</code> بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt install &lt;package_name&gt; --no-upgrade
</pre>

<p>
	يظهر عندها الخرج بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-6.PNG.157cf618449edeb42a8904317ee5f36b.PNG" data-fileid="130752" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130752" data-ratio="25.48" data-unique="qmxryo2y7" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-6.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-6.thumb.PNG.3933b59f9788797a1a27a82352c0b685.PNG"> </a>
</p>

<h3>
	ترقية حزمة موجودة دون تثبيتها في حال لم تكن مثبتة
</h3>

<p>
	يمكن ترقية حزمة موجودة في حال وجودها بشكل مسبق على الحاسب دون أن يتم تثبيتها تلقائيًا في حال لم تكن مثبّتة بإضافة الخيار <code>‎--only-upgrade</code> بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt install &lt;package_name&gt; --only-upgrade
</pre>

<p>
	يظهر عندها الخرج بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-7.PNG.65ef061d48008f9fdaeb4f7b24def3be.PNG" data-fileid="130751" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130751" data-ratio="23.98" data-unique="nsr2vuxlu" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-7.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-7.thumb.PNG.bba48815f9e5f569082c789bb1562bbe.PNG"> </a>
</p>

<h3>
	تثبيت إصدار محدد من حزمة
</h3>

<p>
	يتم اختيار النسخة الأحدث والأكثر استقرارًا للحزمة عند طلب المستخدم لتثبيتها بشكل افتراضي ولكن تظهر بعض الحالات التي يحتاج فيها المستخدم نسخة محددة من حزمة ما. يعد مثل هذا الشرط ضروريًا عند تجهيز وتثبيت بعض أنواع الخدمات والتي قد تشترط وجود حزمة بإصدار معين لكي تعمل بشكل صحيح حيث أنّها لا تكون متوافقة مع النسخ الأحدث. نستطيع تحقيق بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt install &lt;package_name&gt;=&lt;version_number&gt;
</pre>

<h3>
	إزالة الحزم المثبّتة على باستخدام الأداة apt
</h3>

<p>
	يستخدم الأمر <code>apt</code> أيضًا لإزالة الحزم المثبتة على الحاسب أيضًا، يتم ذلك بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt remove &lt;package_name&gt;
</pre>

<p>
	يظهر خرج مشابه للشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-8.PNG.07885e6405f465f4327e1a8e826fa399.PNG" data-fileid="130750" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130750" data-ratio="48.37" data-unique="viz3exxkh" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-8.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-8.thumb.PNG.0d1decde8c97ff57543cb10b2877f6c0.PNG"> </a>
</p>

<p>
	يمكن الاستفادة من الإكمال التلقائي في استعراض الحزم المثبّتة وذلك بشكل مماثل لما قمنا به مسبقًا إذ يكفي كتابة بضعة أحرف من اسم الحزمة والضغط على المفتاح تاب tab ليتم عرض قائمة بالحزم المتاحة.
</p>

<p>
	يمكن إزالة الحزم أيضًا باستخدام الأمر <code>purge</code> وذلك بالشكل التالي:
</p>

<pre class="ipsCode">sudo apt purge &lt;package_name&gt;
</pre>

<p>
	يحذف هذا الأمر كل ما يتعلق بالحزمة من ملفات إعداد وغيرها بينما يبقى الأمر <code>remove</code> على بعض ملفات الإعداد ضمن النظام إذ يعد ذلك مفيدًا في حال حذف المستخدم حزمة ما ورغب الاحتفاظ بالإعدادات التي نفّذها في حال رغبته بتثبيتها لاحقًا. أما الأمر<code>purge</code> فيعد مناسبًا عندما يتم إتلاف ملفات الإعداد بشكل نهائي لا رجعة فيه وعندها يعد خيار إزالة كل ما يتعلق بالحزمة وتثبيته من البداية هو الأفضل. يتم عادة استخدام <code>apt remove</code> أكثر من الأمر <code>apt purge</code> لأن المستخدم لا يحتاج إلى تعديل إعدادات الحزم بشكل كبير.
</p>

<h3>
	البحث عن الحزم في لينكس
</h3>

<p>
	يمكن البحث عن حزمة محددة بكل بساطة باستخدام الأمر <code>apt search</code> ليتم عرض جميع الحزم التي تتضمن مصطلح البحث الذي تم إدخاله وذلك بتنفيذ الأمر:
</p>

<pre class="ipsCode">apt search &lt;search term&gt;
</pre>

<p>
	ليظهر عندها الخرج بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-9.PNG.71de8f3f0b805a968d20a7add45bc405.PNG" data-fileid="130749" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130749" data-ratio="59.26" data-unique="7vfuwrlew" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-9.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-9.thumb.PNG.acc8df078db01a9c7cf05eecf40df00c.PNG"> </a>
</p>

<h3>
	استعراض محتوى حزمة في لينكس
</h3>

<p>
	نستعرض محتوى حزمة ما قبل إزالتها أو تثبيتها بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">apt show &lt;package_name&gt;
</pre>

<p>
	تظهر عندها العديد من المعلومات المتعلقة بالحزمة مثل توصيف الحزمة واسم الحزم التي تعتمد عليها هذه الحزمة إضافة إلى رقم الإصدار الخاص بها وغيرها من المعلومات المهمة والتي يبينها الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-10.PNG.48b0fa85f97496159a86777fd02e417b.PNG" data-fileid="130748" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130748" data-ratio="59.54" data-unique="xrxvqn4vh" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-10.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-10.thumb.PNG.c38f2b5f210849814bdc85b7efd1740c.PNG"> </a>
</p>

<h3>
	استعراض قائمة الحزم الجاهزة للترقية وإصداراتها الحالية
</h3>

<p>
	يمكن استعراض قائمة الحزم المثبّتة على الحاسب والتي يمكن ترقيتها إلى إصدار أحدث. يعد هذا الخيار مهمًا جدًا عندما يتم ترقية مجموعة من الحزم والتي تعتمد على بعضها بحيث نهتم برقم الإصدار الحالي ورقم الإصدار الجديد. نحصل على هذه القائمة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">apt list --upgradable
</pre>

<p>
	ليظهر عندها الخرج بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-11.PNG.00b2e4b8e2d8d0c2f8df83bc76a7a487.PNG" data-fileid="130747" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130747" data-ratio="59.40" data-unique="qmie9us1r" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-11.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-11.thumb.PNG.ce8fdeaf0241cfef1dc7577b3f6681ed.PNG"> </a>
</p>

<p>
	كما نستطيع استعراض قائمة الحزم المثبّتة فقط على الحاسب وذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">apt list --installed
</pre>

<p>
	كما نستطيع استعراض قائمة التطبيقات المثبتة بجميع الإصدارات الموجودة على الحاسب، يعد هذا الأمر بالغ الأهمية للعودة إلى إصدار قديم من حزمة محددة كانت تعمل بشكل صحيح. نستعرض هذه القائمة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">apt list --all-versions
</pre>

<h3>
	تنظيف النظام باستخدام الأداة apt
</h3>

<p>
	نستخدم الأمر <code>apt autoremove</code> لإزالة أية حزم لم يعد هنالك حاجة لوجودها ضمن الحاسب إضافة لإزالة أية مكتبات برمجية أصبحت بلا فائدة والتي تستهلك مساحة تخزينية عند بقائها ضمن النظام. يتم ذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt autoremove
</pre>

<p>
	لنحصل بعدها على الخرج التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-12.PNG.0f8b6aa988ddbf77997da6bdf2ba4d1b.PNG" data-fileid="130746" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="130746" data-ratio="29.84" data-unique="9hyzz8gpl" style="width: 734px; height: auto;" width="800" alt="apt-commands-examples-12.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_07/apt-commands-examples-12.thumb.PNG.a8ce2f20847f2865c5ceab7c8e4f9d60.PNG"> </a>
</p>

<h2>
	الخاتمة
</h2>

<p>
	تضمن هذا المقال تعريفًا بالأداة apt وتوضيحًا للخيارات العديدة التي يمكن الاستفادة منها في تثبيت الحزم وإدارتها. تعد هذه الأداة أساسية لجميع مستخدمي نظام لينكس والذين قد اختاروا توزيعات مبنية على أوبونتو أو ديبيان.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://itsfoss.com/apt-command-guide/" rel="external nofollow">Using apt Commands in Linux [Complete Guide]</a> لصاحبه Abhishek Prakash.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">ما هو نظام التشغيل لينكس؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B4%D8%B1%D9%88%D9%86-%D8%A3%D9%85%D8%B1%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%8A%D9%81%D8%AA%D8%B1%D8%B6-%D8%A3%D9%86-%D9%8A%D8%B9%D8%B1%D9%81%D9%87%D8%A7-%D9%83%D9%84-%D9%85%D8%AF%D9%8A%D8%B1-%D9%86%D8%B8%D9%85-r355/" rel="">عشرون أمرا في لينكس يفترض أن يعرفها كل مدير نظم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">أساسيات إدارة الحزم: apt ،yum ،dnf ،pkg</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">785</guid><pubDate>Tue, 15 Aug 2023 13:00:00 +0000</pubDate></item><item><title>10 &#x62E;&#x637;&#x648;&#x627;&#x62A; &#x628;&#x633;&#x64A;&#x637;&#x629; &#x644;&#x62A;&#x62D;&#x631;&#x64A;&#x631; &#x627;&#x644;&#x645;&#x633;&#x627;&#x62D;&#x629; &#x627;&#x644;&#x632;&#x627;&#x626;&#x62F;&#x629; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/10-%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9-%D8%A7%D9%84%D8%B2%D8%A7%D8%A6%D8%AF%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r780/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_07/7-------.png.34972d057ca6e2c5729a101e44cfc4af.png" /></p>
<p>
	تتراكم البرامج والملفات الخاصة بالمستخدمين مع الزمن ضمن أي نظام تشغيل وحتى عندما يقوم المستخدم بإزالة بعض البرامج فقد تبقى عدة ملفات عالقة للأبد ضمن <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-files-%D9%88%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-systems-r979/" rel="">ملفات نظام التشغيل</a>. يمكن للمستخدم الذي يمتلك مساحات تخزينية تفوق التيرا بايت Tera Byte أن يتجاهل هذه التراكمات، أما المستخدم الذي يمتلك <a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D9%82%D8%B1%D8%B5-%D8%A7%D9%84%D8%B5%D9%84%D8%A8-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9%D8%8C-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-r60/" rel="">قرصًا صلبًا</a> من نوع SSD والذي يكون عادة بسعات منخفضة فقد يضطر إلى إزالة هذه التراكمات بشكل دوري.
</p>

<p>
	يتضمن هذا المقال أبسط الطرق الذي يستطيع المستخدم تنفيذها لتحرير المساحة ضمن توزيعة أوبونتو Ubuntu ويجب على المستخدم مراقبة المساحة الحرة ضمن جهازه باستمرار ليختار الوقت المناسب لتحرير المساحة.
</p>

<h2>
	فحص المساحة الحرة ضمن توزيعة أوبونتو
</h2>

<p>
	يستطيع المستخدم التحقق من المساحة الحرة المتبقية على حاسبه الشخصي باستخدام أداة تحليل استخدام القرص Disk Usage Analyzer المتاحة بشكل افتراضي ضمن توزيعة أوبونتو. يمكن البحث عن هذه الأداة ضمن القائمة الرئيسية وبعد تشغيلها يظهر القرص الصلب والمساحة الحرة المتبقية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129646" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu.PNG.0db718372005bd68dbc39952996ae818.PNG" rel=""><img alt="find-free-disk-space-ubuntu.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129646" data-unique="m7wvcw0re" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu.thumb.PNG.11d4a12003d126e559269e3f8dfdfbfe.PNG"> </a>
</p>

<p>
	يستطيع المستخدم البدء بتحرير المساحة عندما تبلغ المساحة المتبقية من القرص الحد الذي يراه مناسبًا ويمكن بعد الانتهاء من عملية التحرير إعادة تفقد المساحة باستخدام نفس الأداة.
</p>

<h2>
	تحرير مساحة القرص ضمن توزيعتي أوبونتو و لينكس مينت
</h2>

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

<p>
	يتم الاعتماد على نسخة أوبنتو 16.04 في هذا المقال ولكن تبقى الخطوات ذاتها من أجل أوبونتو 18.04 وإصدارات أوبونتو المختلفة كما تنطبق هذه التعليمات على الأنظمة المعتمدة على أوبونتو مثل مينت وغيرها.
</p>

<h3>
	1. التخلص من الحزم غير المستخدمة
</h3>

<p>
	قد تحتاج حزمة ما يقوم المستخدم بتثبيتها إلى تثبيت مجموعة من الحزم الضرورية لعملها، تظهر مشكلة عندما يتم إزالة هذه الحزمة دون أن تتم إزالة الحزم المرتبطة بها مما يؤدي إلى تراكمها واستهلاكها لمساحة تخزينية دون جدوى. وجدنا في [نضع هنا رابط المقالة رقم 7](رابط المقالة رقم 7) أنه يمكن استخدام الأمر apt-get الذي يستخدم لتثبيت الحزم من أجل إزالة الرزم عن طريق الأمر autoremove والذي يزيل هذه الرزم العالقة كما أنه يزيل أي نسخ قديمة من نواة نظام التشغيل لينكس والتي يمكن أن تصبح بلا فائدة بعد ترقية النظام.
</p>

<p>
	يتم ذلك عبر تنفيذ الأمر التالي في موجه الأوامر وبالطبع فإننا نحتاج إلى صلاحيات مناسبة لتنفيذ عمليات الحذف هذه:
</p>

<pre class="ipsCode">sudo apt-get autoremove
</pre>

<p>
	يظهر الشكل أدناه أنه سيتم تحرير مساحة تعادل 300 ميغابايت من القرص الصلب بعد نجاح تنفيذ هذه العملية ويمكن أن تكون هذه المساحة أكبر وذلك تبعا لطريقة استخدام الحاسب والفترة الزمنية المنقضية منذ آخر عملية تحرير مساحة تم تنفيذها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129652" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-2.PNG.d576b115b85c8e098401ac92b1196309.PNG" rel=""><img alt="find-free-disk-space-ubuntu-2.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129652" data-unique="i81250him" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-2.thumb.PNG.3a502fadcd45ef386b6290f31713a167.PNG"> </a>
</p>

<h3>
	2. إزالة التطبيقات غير الضرورية
</h3>

<p>
	توجد العديد من التطبيقات الموجودة بشكل افتراضي ضمن توزيعة أوبونتو، وقد تمر سنين دون أن يستخدمها أحد وخصوصًا الألعاب وبعض التطبيقات الإضافية وبالتالي يمكن إزالتها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129651" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-3.PNG.8f00dd422b6ee489cc8b47ad72826882.PNG" rel=""><img alt="find-free-disk-space-ubuntu-3.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129651" data-unique="4ffo33enk" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-3.thumb.PNG.ba188c59f749e8651999b5e362b4eac8.PNG"> </a>
</p>

<p>
	كما ينطبق ذلك على بعض التطبيقات التي ثبّتها المستخدم واستخدمها مرة واحدة ونسي استخدامها أو أنه لم يعد بحاجتها لذلك يجب إزالة هذه التطبيقات إما بالاعتماد على مركز البرمجيات <strong>Software Center</strong> أو باستخدام موجه الأوامر وتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt-get remove package-name1 package-name2
</pre>

<h3>
	3. تنظيف الذاكرة المخبئية Cache الخاصة بالأداة APT
</h3>

<p>
	تستخدم توزيعة أوبونتو <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">الأداة APT</a> من أجل تثبيت وإدارة وإزالة الحزم البرمجية. تحتفظ هذه الأداة بنسخة من الحزم البرمجية التي تم تحميلها وتثبيتها مسبقًا حتى بعد أن تتم إزالة هذه الحزم البرمجية من النظام. يتم تخزين هذه الحزم ضمن المسار ‎/var/cache/apt/archives. يزداد حجم هذا المجلّد مع الزمن ويمكن التحقق من حجمه عبر تنفيذ الأمر:
</p>

<pre class="ipsCode">sudo du -sh /var/cahce/apt
</pre>

<p>
	يظهر الشكل أنه تم إشغال حوالي 500 ميغابايت من القرص في المجلّد السابق ويجب تحرير هذه المساحة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129650" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-4.PNG.132e33817699df9e6f72a6c8da0eb1c3.PNG" rel=""><img alt="find-free-disk-space-ubuntu-4.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129650" data-unique="d8j4t8p9t" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-4.thumb.PNG.26571d6f389d60721589d07178a8eba2.PNG"> </a>
</p>

<p>
	يمكن تحرير هذه المساحة بطريقتين، إما عن طريق إزالة الرزم التي أصبحت قديمة جدًا والتي لا يمكن إعادة استخدامها بعد اعتماد تحديث ما مما يجعلها بلا قيمة ويتم ذلك بتنفيذ الأمر:
</p>

<pre class="ipsCode">sudo apt-get autoclean
</pre>

<p>
	أو عبر حذف كامل هذه المساحة التخزينية مما يوفر الكثير من المساحة ولكنه قد يجبر المستخدم على تنزيل بعض الحزم البرمجية في حال احتاجها مرة ثانية في حال لم تكن هذه الحزم قديمة ويتم ذلك بتنفيذ الأمر:
</p>

<pre class="ipsCode">sudo apt-get clean
</pre>

<h2>
	4. تفريغ ملفات السجلات
</h2>

<p>
	<strong>ملاحظة</strong>: هذه الخطوة تتطلب معرفة متقدمة.
</p>

<p>
	تتضمن جميع توزيعات لينكس آليات تسجيل لحفظ جميع العمليات والقيم التي تتغير ضمن النظام. نجد سجلًا خاصًا <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AF%D9%88%D8%B1-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%AA%D9%86%D8%B8%D9%8A%D9%85%D9%87-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1723/" rel="">بنواة نظام التشغيل</a> وسجلًا خاصًا برسائل النظام وسجلًا يحتوي على الأخطاء الخاصة بجميع الخدمات التي تعمل ضمن نظام لينكس سواء كانت من ضمن نظام التشغيل أو أن المستخدم ثبتها على النظام.
</p>

<p>
	يزداد حجم هذه السجلات بسرعة كبيرة، إذ تسجّل هذه القيم دون توقف مما يجعل حجم هذه السجلات كبيرًا ويمكن الاطلاع على هذا الحجم عن طريق تنفيذ:
</p>

<pre class="ipsCode">journalctl --disk-usage
</pre>

<p>
	تجدر الإشارة إلى أنه على عكس الحزم فلا يجب حذف جميع السجلات ويجب الاحتفاظ ببعضها لذلك من الشائع أن يحتفظ المستخدم بالسجلات التي لم يمض عليها زمن طويل، يتم تنفيذ الأمر أدناه لإزالة السجلات التي تتضمن المعطيات المتعلقة بالأداء منذ أكثر من ثلاث أيام:
</p>

<pre class="ipsCode">sudo journalctl --vacuum-time=3d
</pre>

<p>
	يظهر الخرج أدناه بعد تنفيذ الأمر السابق:
</p>

<pre class="ipsCode">abhishek@itsfoss:~$ journalctl --disk-usage
Archived and active journals take up 1.8G in the file system.

abhishek@itsfoss:~$ sudo journalctl --vacuum-time=3d
Vacuuming done, freed 1.7G of archived journals from /var/log/journal/1b9ab93094fa2984beba73fd3c48a39c
</pre>

<h3>
	5. إزالة النسخ القديمة من التطبيقات المثبّتة باستخدام مدير الحزم Snap
</h3>

<p>
	<strong>ملاحظة</strong>: هذه الخطوة تتطلب معرفة متقدمة.
</p>

<p>
	يتيح مدير الحزم Snap الكثير من التطبيقات التي تفيد المستخدمين ولهذا يكون لها شعبية كبيرة مقارنة بمدراء الحزم التقليديين، تكمن المشكلة الأساسية أنّ الحزم المثبّتة عن طريق مدير الحزم Snap تكون أكبر حجمًا من غيرها ومما يزيد من حجم المشكلة أن مدير الحزم Snap يحتفظ بنسختين على الأقل من نفس الحزمة التي يتم تثبيتها وذلك في حال رغب المستخدم العودة إلى نسخة أقدم من نفس الحزمة، نستعرض المساحة التي تستهلكها هذه الأداة عبر تنفيذ الأمر التالي ويظهر الخرج المبين أدناه بعد تنفيذها
</p>

<pre class="ipsCode">du -h /var/lib/snapd/snaps
4.0K    /var/lib/snapd/snaps/partial
5.6G    /var/lib/snapd/snaps
</pre>

<p>
	نلاحظ أن المساحة المشغولة وصلت إلى خمسة غيغابايت وهذه المساحة كبيرة نسبيًا. مع تفاقم هذه المشكلة عمد أحد المطورين العاملين ضمن فريق تطوير مدير حزم Snap وهو آلان بوب إلى تطوير سكربت Script بسيط يزيل النسخ القديمة من التطبيقات المثبّتة باستخدام مدير الحزم Snap.
</p>

<p>
	ننشئ ملف نص برمجي ونضع فيه المحتوى التالي:
</p>

<pre class="ipsCode">#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done
</pre>

<p>
	يجب إضافة الصلاحيات التنفيذية المناسبة لملف النص البرمجي السابق وتشغيله مع صلاحيات مدير باستخدام sudo. يتم تحرير المساحة المحجوزة التي يمكن تحريرها ونستعرض المساحة بنفس الطريقة السابقة ليكون الخرج بالشكل التالي:
</p>

<pre class="ipsCode">du -h /var/lib/snapd/snaps
4.0K    /var/lib/snapd/snaps/partial
2.5G    /var/lib/snapd/snaps
</pre>

<p>
	فصلنا أكثر عن هذه الخطوة في مقال <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B3%D8%AD-%D8%AD%D8%B2%D9%85-snap-%D8%A7%D9%84%D9%85%D8%B9%D8%B7%D9%84%D8%A9-%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r623/" rel="">مسح حزم Snap المعطلة لتحرير المساحة في لينكس</a>.
</p>

<h3>
	6. إزالة الذاكرة الوسيطة الخاصة بالصور المصغّرة thumbnail
</h3>

<p>
	<strong>ملاحظة</strong>: هذه الخطوة تتطلب معرفة متقدمة.
</p>

<p>
	تنشئ توزيعة أوبونتو صور مُصغَّرة خاصة بالعرض ويخزنها في مجلّد مخفي ضمن المساحة التخزينية الخاصة بالمستخدم وهو ‎~/.cache/thumbnails. يزداد عدد هذه المصغّرات مع الزمن وبالتالي يزداد حجمها مع العلم بأن بعض هذه المصغرات تعود لصور لم تعد موجودة ولهذا يجب إزالتها. يمكن التحقق من حجم الذاكرة الوسيطة الخاصة بالمصغرات عبر تنفيذ الأمر التالي:
</p>

<pre class="ipsCode">du -sh ~/.cache/thumbnails
</pre>

<p>
	يبين الشكل التالي نتيجة تنفيذ هذا الأمر:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129649" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-5.PNG.67346315b7442428c66bdc0546968a91.PNG" rel=""><img alt="find-free-disk-space-ubuntu-5.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129649" data-unique="9q4efe1vf" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-5.thumb.PNG.521d338ee0a5ffad512a940d298dd28f.PNG"> </a>
</p>

<p>
	يفضل تحرير هذه المساحة كل بضعة أشهر ويمكن ذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">rm -rf ~/.cache/thumbnails/*
</pre>

<h3>
	7. إيجاد وحذف الملفات المتكررة
</h3>

<p>
	يمكن أن تتكرر الملفات دون إدراك المستخدم وفي حال كانت هذه الملفات ذات حجوم كبيرة كملفات الفيديو أو الصور عالية الدقة فسوف يستهلك ذلك مساحة كبيرة ولهذا يمكن البحث عن هذه الملفات المكررة وإزالتها. يمكن تنفيذ ذلك باستخدام الأداة ذات الواجهات الرسومية FSlint أو باستخدام الأداة FDUPES التي تعمل ضمن موجه الأوامر والتي يبين الشكل أدناه مثالًا على عملها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129648" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-6.PNG.772e012b7a9968e9f5c698076fabd9f0.PNG" rel=""><img alt="find-free-disk-space-ubuntu-6.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129648" data-unique="lq3b57yns" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-6.thumb.PNG.d877178527a159c42da6a04301f636a6.PNG"> </a>
</p>

<p>
	يمكن للخبراء تنفيذ بعض الخطوات الإضافية لتحرير المزيد من المساحة، ولا يعني ربط الخطوات التالية بالخبراء أن المستخدم العادي لا يجب أن يحاول تنفيذ هذه الخطوات ولكن من الأفضل أن يكون حذرًا وأن يحتفظ بنسخة احتياطية لملفاته المهمة.
</p>

<h3>
	8. إزالة نوى لينكس القديمة التي تم تثبيتها بشكل يدوي
</h3>

<p>
	<strong>ملاحظة</strong>: هذه الخطوة تتطلب خبرة متقدمة.
</p>

<p>
	ناقشنا في الخطوة رقم 1 السابقة استخدام أمر لإزالة نواة نظام لينكس القديمة ولكن يجب الانتباه أنّ هذا الأمر لا يزيل نواة لينكس التي يثبتها المستخدم بشكل يدوي وإنما فقط يزيل ما ثبّته النظام تلقائيًا. تحرر عملية الإزالة هذه الكثير من المساحة وللتحقق من وجود هذه النوى على الجهاز يمكن تنفيذ الأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_3535_6">sudo dpkg --list 'linux-image*'</pre>

<p>
	لا تختلف إزالة نواة نظام التشغيل عن إزالة أية حزمة برمجية، فبعد أن يظهر الأمر السابق النوى المتاحة يتم تسجيل رقم الإصدار VERSION الذي يجب إزالته وننفذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt-get remove linux-image-VERSION
</pre>

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

<h3>
	9. إزالة الحزم اليتيمة
</h3>

<p>
	<strong>ملاحظة</strong>: هذه الخطوة تتطلب خبرة متقدمة.
</p>

<p>
	نعرّف الحزم اليتيمة على أنّها الحزم التي يتم تثبيتها ضمن النظام لكونها متطلّبًا لحزمة أساسية أخرى وقد حذف المستخدم هذه الخدمة الأساسية وبقيت الحزمة اليتيمة ضمن النظام. وجدنا في الخطوة رقم 1 أنه يمكن تنفيذ أمر لإزالة هذه الحزم ولكن تكمن المشكلة الأساسية إذا ثبت المستخدم هذه الحزم المكمّلة لحزمة ما بشكل يدوي وبالتالي لن يستطيع الأمر السابق إزالتها لأنه لا يستطيع الجزم بأن المستخدم ثبت هذه الحزمة لحاجته لها أم أنها كانت متطلّبًا لحزمة أخرى فيضطر إلى تجاوزها.
</p>

<p>
	يجب أن يبحث المستخدم عن هذه الحزم بشكل يدوي ولكن لحسن الحظ توجد عدة أدوات منها ما يمتلك واجهات رسومية مثل gtkorphan والتي تساعد في العثور على الحزم اليتيمة.
</p>

<p>
	يتم تثبيت هذه الأداة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt-get install gtkorphan
</pre>

<p>
	يبين الشكل التالي الواجهة الأساسية للأداة وتجدر الإشارة إلى أنّ المستخدم لا يحتاج لهذه الأداة فعليًا إلا إذا كان بحاجة كل المساحة التخزينية المتاحة لسبب ما.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="129653" href="https://academy.hsoub.com/uploads/monthly_2023_07/clean-up-space-ubuntu-linux-4.png.7bc5ed2491a78bbcdcf7007c139f6eac.png" rel=""><img alt="clean-up-space-ubuntu-linux-4.png" class="ipsImage ipsImage_thumbnailed" data-fileid="129653" data-unique="6a28t8dww" src="https://academy.hsoub.com/uploads/monthly_2023_07/clean-up-space-ubuntu-linux-4.png.7bc5ed2491a78bbcdcf7007c139f6eac.png"> </a>
</p>

<p>
	<strong>ملاحظة</strong>: قد لا تكون الحزمة gtkorphan متوفرة أثناء قراءة المقال، لذا يمكنك استعمال البديل المناسب والمريح لك، مثل deborphan وغيرها.
</p>

<h3>
	10. استخدام الأدوات ذات الواجهات الرسومية لتحرير المساحة في أوبونتو
</h3>

<p>
	توجد عدة سكربتات تستخدم لتحرير المساحة ضمن توزيعة أوبونتو وقد تم ذكر البعض منها كما توجد المزيد منها ما لم تشمله هذا المقال. يصبح تذكر الأوامر صعبًا لدى بعض المستخدمين ولهذا يمكن استخدام الأدوات ذات الواجهات الرسومية وتعد الأداة Stacer واحدة من أهم هذه الأدوات والتي تتسم بسهولة الاستخدام.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="PNG" data-fileid="129647" href="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-7.PNG.96c380abf01e197920a49d9491d54db1.PNG" rel=""><img alt="find-free-disk-space-ubuntu-7.PNG" class="ipsImage ipsImage_thumbnailed" data-fileid="129647" data-unique="qrsjbjufz" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2023_07/find-free-disk-space-ubuntu-7.thumb.PNG.548c1f86b4e50e418aa202da59b2f2a4.PNG"> </a>
</p>

<h2>
	الخاتمة
</h2>

<p>
	تضمنت المقالة بعض الخطوات الأساسية لتحرير المساحة ضمن توزيعة أوبونتو والأنظمة المعتمدة عليها، حيث أنّ بعض هذه الخطوات بسيطة ويجب على جميع المستخدمين تنفيذها بشكل دوري ومنها ما يتطلب أنْ يكون المستخدم خبيرًا ويمكن تجنبها لوقت الحاجة الفعلية للمساحة ويترك تقدير ذلك للمستخدم وحاجته الفعلية للمساحة.
</p>

<p>
	ترجمة وبتصرف للمقال ‎<a href="https://itsfoss.com/free-up-space-ubuntu-linux/" rel="external nofollow">7 Simple Ways to Free Up Space on Ubuntu and Linux Mint</a> لصاحبه Abhishek Prakash.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/" rel="">التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r634/" rel="">كيفية تثبيت التطبيقات في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%81%D9%87%D9%85-%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%86%D9%83%D8%B3-r53/" rel="">كيف تفهم هيكلية نظام الملفات في لنكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">780</guid><pubDate>Thu, 15 Jun 2023 13:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x643;&#x627;&#x645;&#x644; &#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x646;&#x638;&#x627;&#x645; Flatpak &#x644;&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x627;&#x644;&#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; &#x648;&#x625;&#x62F;&#x627;&#x631;&#x62A;&#x647;&#x627; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%83%D8%A7%D9%85%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%86%D8%B8%D8%A7%D9%85-flatpak-%D9%84%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%88%D8%A5%D8%AF%D8%A7%D8%B1%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r699/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_05/-----Flatpak----.png.739a9f3a4cf64a972c069dade8cb130c.png" /></p>
<p>
	يعد نظام Flatpak بأنه نظام تحزيم عالمي جديد يتيح صيغة format جديدة لتثبيت التطبيقات ضمن توزيعات لينكس بسهولة.
</p>

<p>
	يمكن تثبيت التطبيقات ضمن <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينكس</a> بعدة طرق، وأسهل هذه الطرق استخدام مركز البرمجيات Software Center للبحث عن التطبيق وتثبيته، أما التطبيقات غير الموجودة في المركز فيمكن أن يتم تثبيتها باستخدام حزم RPM أو DEB. أما بالنسبة لتوزيعات ديبيان والتوزيعات المبنية عليها فتستخدم حزم PPA للحصول على التطبيقات، وبشكل عام يمكن بناء أي تطبيق من الرماز المصدري الخاص به والمتاح حتمًا إذا كان التطبيق جاهزًا للعمل ضمن نظام تشغيل لينكس.
</p>

<p>
	توجد العديد من المشاكل التي يمكن أن تظهر عند استخدام الطرق السابقة، فمركز البرمجيات ومخازن تثبيت التطبيقات عمومًا قد لا تمتلك أحدث نسخة من التطبيق المطلوب. كما أن التعامل مع الحزم الضرورية لعمل تطبيق ما وتثبيتها بشكل صحيح يمكن أن يكون متعبًا في بعض الحالات، كما أن بعض الملفات المستخدمة في تثبيت البرمجيات يمكن أن تكون خطرة أما بناء التطبيق انطلاقًا من رماز المصدر الخاص به قد يكون صعبًا بالنسبة لبعض المستخدمين.
</p>

<p>
	ظهرت الحاجة إلى وجود نظام تحزيم عالمي بسبب الأسباب السابقة ومع ازدياد عدد وتنوع توزيعات لينكس بحيث يكون هذا النظام الجديد قادرًا على تثبيت وتشغيل التطبيق بغض النظر عن التوزيعة المستخدمة. طوّرت مجموعة Canonical نظام <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%B3%D8%AD-%D8%AD%D8%B2%D9%85-snap-%D8%A7%D9%84%D9%85%D8%B9%D8%B7%D9%84%D8%A9-%D9%84%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%AD%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r623/" rel="">Snap</a> لإيجاد حل لهذه المشاكل كما أن بعض المطورين المستقلين طوروا نظام تحزيم مستقل وأسموه AppImage والذي يحمّل التطبيق ويشغله دون تثبيته فعليًا على الحاسب.
</p>

<p>
	يوجد إلى جانب هذين النظامين نظام تحزيم عالمي مميز اسمه Flatpak والذي يمكن استخدامه على معظم توزيعات لينكس.
</p>

<h2>
	ما هو نظام Flatpak؟
</h2>

<p>
	نعرّف <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%81%D9%84%D8%A7%D8%AA-%D8%A8%D8%A7%D9%83-flatpak-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D8%B2%D9%8A%D9%85-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r636/" rel="">نظام Flatpak</a> على أنه إطار عمل للتطبيقات ضمن نظام التشغيل لينكس بغض النظر عن التوزيعة المستخدمة. يهدف نظام Flatpak إلى توفير حلول لمشاكل تثبيت التطبيقات مستقلة عن منصة العمل بالإضافة إلى العديد من المزايا الأخرى مما يسهل العمل على المطورين بحيث يكفي تطوير التطبيق مرة واحدة واستخدامه على جميع توزيعات نظام لينكس -التي تدعم نظام Flatpak- دون الحاجة إلى إيجاد طريقة للتثبيت لتناسب كل توزيعة على حدى.
</p>

<p>
	المزايا الأساسية لنظام Flatpak:
</p>

<ul>
	<li>
		يقدم هذا النظام واجهة موحّدة لتوزيعات لينكس المختلفة، ويضاف إلى ذلك إمكانية دمجه بالتوزيعات المختلفة بسهولة إذ يمكن تثبيت هذا النظام مباشرة من مراكز البرمجيات الخاصة بكل توزيعة فمثلًا يمكن تثبيت النظام Flatpak من ضمن مركز برمجيات Gnome ضمن أية توزيعة لينكس تستخدمه.
	</li>
	<li>
		تتميز تطبيقات Flatpak بأنها متوافقة مع النسخ التالية أيْ أنّ التطبيق يكون مناسبًا للاستخدام ضمن الإصدار التالي من التوزيعة دون تنفيذ أية تغييرات.
	</li>
	<li>
		الحفاظ على الحزم المتعلقة بالحزمة الأساسية بزمن التشغيل حيث تتم إضافة هذه الحزم وكأنها جزء من التطبيق.
	</li>
	<li>
		على الرغم من أنّ نظام Flatpak يتيح توزيع التطبيقات بشكل مركزي إلا أنّه يدعم أيضًا التوزيع اللامركزي للتطبيقات أيضًا.
	</li>
</ul>

<h2>
	تفعيل دعم نظام Flatpak لتوزيعات لينكس المختلفة
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_05/use-flatpak-linux.jpeg.9a4425494dc3333f3919008913bdb04e.jpeg" data-fileid="126096" data-fileext="jpeg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="126096" data-unique="sbvshpquk" alt="use-flatpak-linux.jpeg" src="https://academy.hsoub.com/uploads/monthly_2023_05/use-flatpak-linux.jpeg.9a4425494dc3333f3919008913bdb04e.jpeg"> </a>
</p>

<p>
	تنقسم عملية تثبيت نظام Flatpak إلى خطوتين أساسيتين، ففي الخطوة الأولى يتم تثبيت النظام flatpak وفي الخطوة الثانية يُضاف مخزن برمجيات Flatpak والذي يسمّى باسم Flathub إلى قائمة مصادر البرمجيات مما يسمح باستخدامه لتثبيت التطبيقات.
</p>

<h3>
	تثبيت Flatpak على أوبونتو Ubuntu ولينكس مينت Mint
</h3>

<p>
	يتم تثبيت النظام بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo apt install flatpak
</pre>

<h3>
	تثبيت Flatpak على توزيعات ريدهات Red hat
</h3>

<p>
	يتم تثبيت النظام بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo yum install flatpak
</pre>

<h3>
	تثبيت Flatpak على توزيعة openSUSE
</h3>

<p>
	يتم تثبيت النظام بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo zypper install flatpak
</pre>

<h3>
	تثبيت Flatpak على توزيعة آرتش Arch Linux
</h3>

<p>
	يتم تثبيت النظام بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">sudo pacman -S flatpak
</pre>

<h3>
	حل مشكلة تثبيت النظام Flatpak
</h3>

<p>
	يمكن في حال قد صادفت المستخدم مشكلة شبيهة بما يلي:
</p>

<pre class="ipsCode">error: runtime/org.freedesktop.Platform/x86_64/1.6 not installed
</pre>

<p>
	أن تحل هذه المشكلة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak update -v
</pre>

<p>
	إذ أن هذه المشكلة تحدث بسبب عدم اكتمال التثبيت لسبب ما سواء كان اتصال الانترنت غير مستقرًا أو أنه قد تم إطفاء الحاسب لسبب ما. تحل هذه المشكلة عادة بتحديث قائمة مخازن برمجيات Flatpak عن طريق تنفيذ الأمر السابق.
</p>

<h2>
	تفعيل دعم نظام Flatpak ضمن مركز البرمجيات
</h2>

<p>
	تدار تطبيقات Flatpak بشكل كامل باستخدام الأوامر النصية، ولكن يفضل العديد من المستخدمين الواجهات الرسومية بدًلا من كتابة الأوامر وهنا تبرز أهمية نظام Flatpak.
</p>

<p>
	نجد نظام Flatpak مدمجًا بشكل مسبق ضمن العديد من توزيعات لينكس ولهذا لا يحتاج المستخدم تنفيذ أية عملية إضافية. أما في التوزيعات التي لا تتيح هذا الدعم بشكل مسبق فيجب تثبيت إضافة Gnome لتثبيت Flatpak باستخدام الواجهات الرسومية. ننفذ الأمر التالي لتحقيق ذلك ضمن توزيعة أوبونتو والتوزيعات المعتمدة عليها:
</p>

<pre class="ipsCode">sudo apt install gnome-software-plugin-flatpak
</pre>

<p>
	أما في حالة التوزيعات الأخرى، فيجب استبدال مدير الحزم المستخدم في الأمر السابق فقط. نعيد تشغيل الحاسب أو خدمة مركز البرمجيات حسب ما يفضّله المستخدم.
</p>

<p>
	نحمل الملف الذي يملك اللاحقة <code>‎.flatpakref</code> من الموقع الخاص بمطور التطبيق أو من <a href="https://flathub.org/home" rel="external nofollow">موقع المتجر الرسمي لتطبيقات Flatpak</a>.
</p>

<p>
	ننتقل إلى مجد التحميل وننقر مرتين على الملف لتظهر واجهة مركز البرمجيات والتي تحتوي خيارات التثبيت كما تظهر الصورة أدناه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_05/Flatpak-1080x586.jpg.502470606ab8713ba6364fb4043e445f.jpg" data-fileid="126100" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="126100" data-unique="76a2gfj1v" alt="Flatpak-1080x586.jpg" src="https://academy.hsoub.com/uploads/monthly_2023_05/Flatpak-1080x586.thumb.jpg.854390e53134dea9b04bc02ae23330e3.jpg"> </a>
</p>

<p>
	يمكن أيضًا الضغط على الزر اليميني على الملف واختيار فتح الملف باستخدام مثبت البرمجيات الافتراضي (open with software install (default وذلك في حال لم تنجح عملية النقر المزدوج على الملف. نشغّل مركز البرمجيات بعد انتهاء التثبيت من قائمة التطبيقات ويكون النظام Flatpak جاهزًا للاستخدام.
</p>

<h2>
	استخدام أوامر نظام Flatpak: مخصص للمستخدمين المتقدمين والخبراء
</h2>

<p>
	يفضّل المستخدم الخبير الأوامر النصية عبر <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a> لأنها تتيح التحكم الكامل بالأدوات المختلفة.
</p>

<p>
	<strong>ملاحظة</strong>: تجدر الإشارة إلى أنّ الجزء التالي من المقال مخصص للمستخدمين الخبراء الذين يفضلون استخدام الأوامر على الواجهات الرسومية.
</p>

<h3>
	إضافة مخازن البرمجيات من أجل تثبيت التطبيقات عن طريق Flatpak
</h3>

<p>
	يحتاج استخدام نظام Flatpak وجود معلومات عن مخازن البرمجيات التي يتم استخدامها لتحميل التطبيقات. يجب إضافة مخزن Flathub إذ أنّه يتيح تثبيت عدد كبير من التطبيقات التي تهم جميع المستخدمين. تجدر الإشارة إلى أنّ مخزن البرمجيات هذا يعد الأكثر استخدامًا لغاية كتابة المقالة ولهذا تم استخدامه ويمكن للمستخدم الذي يفضّل مخزنًا آخرًا أن يستبدل اسم المخزن فقط في الأوامر التالية. نبدأ بإضافة المخزن البرمجي بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
</pre>

<p>
	يمكن أن نجد أيضًا العديد من المخازن البرمجية المتاحية ويستطيع المستخدم إضافتهم إذا رغب بذلك.
</p>

<h3>
	البحث عن حزمة ما باستخدام موجه الأوامر ضمن Flatpak
</h3>

<p>
	يمكن البحث عن التطبيقات المتاحة عن طريق النظام Flatpak بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak search applicationname
</pre>

<p>
	يجب أن يتطابق اسم التطبيق الذي يدخله المستخدم مع اسم التطبيق الفعلي وإلا فلن تظهر نتيجة البحث. تبين الصورة أدناه نتيجة البحث عن أحد التطبيقات الشهيرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-search-new.jpg.ba29d32ddc6b4cddf7ff68f99d433f4a.jpg" data-fileid="126097" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="126097" data-unique="wok6b4vaj" alt="flatpak-search-new.jpg" src="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-search-new.jpg.ba29d32ddc6b4cddf7ff68f99d433f4a.jpg"> </a>
</p>

<p>
	تظهر نتيجة البحث السابقة حقلين أساسيين لعملية تثبيت التطبيقات وهما معرف التطبيق "Application ID" وقائمة المخازن"Remotes".
</p>

<h3>
	تثبيت تطبيقات Flatpak عبر سطر الأوامر
</h3>

<p>
	يتم تثبيت تطبيقات Flatpak عن طريقة تنفيذ أمر من الشكل التالي:
</p>

<pre class="ipsCode">flatpak install &lt;remotes&gt; &lt;ApplicationID&gt;
</pre>

<p>
	فمن أجل المثال السابق ننفذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak install flathub org.libreoffice.LibreOffice
</pre>

<p>
	تبدأ عندها عملية التثبيت كما في الشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-flathub-installation.jpg.1e7be80ab2e73011765098b99139d614.jpg" data-fileid="126099" data-fileext="jpg" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="126099" data-unique="zeqc94o0m" alt="flatpak-flathub-installation.jpg" src="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-flathub-installation.jpg.1e7be80ab2e73011765098b99139d614.jpg"> </a>
</p>

<p>
	يتيح بعض مطوري التطبيقات مخزن البرمجيات الخاص بهم وعندها يمكن استخدام المسار الكامل لملف flatpakref الخاص بالتطبيق من أجل تثبيت التطبيقات كما يلي:
</p>

<pre class="ipsCode">flatpak install --from https://flathub.orf/repo/appstream/com.spotify.Client.flatpakref
</pre>

<h3>
	تثبيت تطبيقات Flatpak باستخدام ملف flatpakref
</h3>

<p>
	يمكن استخدام ملف flatpakref في حال تحميله إلى الحاسب في تثبيت التطبيق، حيث ننتقل إلى المسار الذي يحوي الملف ومن ثم ننفذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak install &lt;ApplicationID&gt;.flatpakref
</pre>

<p>
	نفترض أن الملف الذي قمنا بتنزيله هو "net.poedit.Poedit.flatpakref" فيصبح الأمر الذي يجب تنفيذه بالشكل التالي:
</p>

<pre class="ipsCode">flatpak install net.poedit.Poedit.flatpakref
</pre>

<h3>
	تشغيل تطبيق تم تثبيته عن طريق النظام Flatpak
</h3>

<p>
	يتم تشغيل التطبيقات التي تم تثبيتها باستخدام نظام Flatpak بتنفيذ الأوامر من الشكل التالي:
</p>

<pre class="ipsCode">flatpak run &lt;ApplicationID&gt;
</pre>

<p>
	فبالعودة للمثال السابق، نشغل التطبيق spotify بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak run com.spotify.Client
</pre>

<h3>
	عرض جميع التطبيقات المثبّتة باستخدام Flatpak ضمن النظام
</h3>

<p>
	يمكن عرض التطبيقات التي ثبتها المستخدم ضمن الحاسب بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak list
</pre>

<p>
	ليظهر الخرج بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-list.PNG.d6e2905b6e3c90dfba51a98a84b73138.PNG" data-fileid="126098" data-fileext="PNG" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="126098" data-unique="m73fhnkzd" alt="flatpak-list.PNG" src="https://academy.hsoub.com/uploads/monthly_2023_05/flatpak-list.thumb.PNG.f964ff31ea043f4742f379e97b35dd72.PNG"> </a>
</p>

<h3>
	إزالة تطبيق مثبت باستخدام النظام Flatpak
</h3>

<p>
	تتم إزالة التطبيقات بتنفيذ أمر من الشكل التالي متضمنًا معرف التطبيق:
</p>

<pre class="ipsCode">flatpak uninstall &lt;ApplicationID&gt;
</pre>

<p>
	ففي حال الرغبة بإزالة تطبيق spotify، ننفذ الأمر التالي:
</p>

<pre class="ipsCode">flatpak uninstall com.spotify.Client
</pre>

<h3>
	تحديث جميع التطبيقات المثبّتة باستخدام Flatpak
</h3>

<p>
	يتم تنفيذ الأمر التالي لإتمام عملية التحديث:
</p>

<pre class="ipsCode">flatpak update
</pre>

<h3>
	تحرير المساحة بإزالة التطبيقات غير المستخدمة والمثبّتة باستخدام flatpak
</h3>

<p>
	يجب تحرير المساحة الخاصة بالتطبيقات غير المستخدمة من فترة لأخرى. يمكن تنفيذ الأمر التالي لتحرير المساحة المرتبطة بتطبيقات ثبتها المستخدم باستخدام نظام Flatpak:
</p>

<pre class="ipsCode">flatpak uninstall --unused
</pre>

<p>
	يستعرض هذا الأمر قائمة التطبيقات غير المستخدمة ويتيح للمستخدم خيار إزالتها.
</p>

<h2>
	الخاتمة
</h2>

<p>
	يتيح نظام Flatpak العديد من التطبيقات للمستخدمين حيث أنّ موقع Flathub وسيلة مريحة للعثور على التطبيقات التي يحتاجها المستخدم. يساعد هذا النظام المطورين على إنشاء حزمة واحدة قابلة للعمل على معظم توزيعات لينكس مما يوفر العناء من تطوير حل خاص بكل توزيعة على حدى كما أنّ ذلك يسهل عمليات الصيانة وحل المشاكل أيضًا.
</p>

<p>
	يمكن مقارنة هذا النظام بمنافسه Snap، وبمقارنة بسيطة بين هذين النظامين نجد أنّ النظام flatpak أكثر تعقيدًا إذ أنّ اعتماده على معرف التطبيق بدلًا من اسمه يزيد من تعقيده بالنسبة للمستخدم، إلا أنّ تثبيت وإزالة الحزم باستخدام flatpak لا يتطلب صلاحيات متقدمة لسبب ما وهذا الأمر جيد.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://itsfoss.com/flatpak-guide/" rel="external nofollow">Using Flatpak on Ubuntu and Other Linux Distributions [Complete Guide]‎</a> لصاحبه Ambarish Kumar.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r634/" rel="">كيفية تثبيت التطبيقات في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9%D8%A7%D8%AA-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r629/" rel="">مدخل إلى مستودعات أوبنتو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">699</guid><pubDate>Mon, 29 May 2023 14:00:00 +0000</pubDate></item></channel></rss>
