Jannah Theme License is not validated, Go to the theme options page to validate the license, You need a single license for each domain name.

8 أنماط Bash مفيدة مختبئة في المشاريع الحقيقية وكيفية استخدامها

أفضل أنماط Bash المخفية في المشاريع العملية وكيف تستخدمها لكتابة سكربتات احترافية

يُعد Bash من أكثر أدوات سطر الأوامر استخدامًا بين المطورين ومديري الأنظمة، لكنه يخفي في داخله أنماطًا قوية لا تظهر بوضوح في الدروس التقليدية. هذه الأنماط تُستخدم بكثرة داخل المشاريع الحقيقية لتحسين الأداء، تقليل الأخطاء، وجعل السكربتات أكثر مرونة وقابلية للصيانة.

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

في هذا المقال، ستتعرف على مجموعة من أنماط Bash العملية التي يستخدمها المحترفون يوميًا، مع شرح واضح لكيفية تطبيقها في مشاريعك. الهدف ليس فقط التعلم، بل بناء سكربتات أكثر كفاءة واستقرارًا توفر عليك الوقت والجهد.

1. استخدام `grep` و `awk` للبحث عن الأنماط وتصفية البيانات

bash-pattern-1-grep-awk-search-filter-data 8 أنماط Bash مفيدة مختبئة في المشاريع الحقيقية وكيفية استخدامها

تُعد أدوات سطر الأوامر مثل grep و awk من الأدوات الأساسية في Bash للبحث عن الأنماط وتصفية البيانات.
تُستخدم grep للبحث عن الأنماط داخل الملفات، بينما تُستخدم awk لمعالجة النصوص وتحليلها.
يمكن دمج هاتين الأداتين لإنشاء مسارات عمل قوية وفعالة.

ما الذي تكسبه:

  • بحث فعال عن الأنماط: يتيح لك grep العثور بسرعة على الأسطر التي تحتوي على أنماط محددة، مما يوفر الوقت عند التعامل مع الملفات الكبيرة.
  • معالجة بيانات مرنة: يوفر awk قدرات قوية لتحليل البيانات وتنسيقها، مما يجعله مثاليًا لاستخراج المعلومات وتنظيمها.
  • تكتنز برمجة الشل (Shell scripting) بالعديد من الأسرار والحيل الخفية، لذا من المفيد أن تكون لديك بعض الأنماط الجاهزة. للإلهام، جرّب هذه السكربتات من مشاريع حقيقية، بما في ذلك Homebrew و BashBlog و nvm. بتعلّمك من هذه الأمثلة، يمكنك تحسين سكربتات الشل الخاصة بك وإتقان تقنيات جديدة.

    تحديد موقع إعدادات افتراضي

    للحفاظ على ملفات الإعدادات الخاصة بك منظمة

    عندما ترغب في تحديد دليل إعدادات لمشروعك، استخدم هذا النمط:

    "${XDG_CONFIG_HOME:-$HOME/.config}/myproject/config"
    

    ستتوسع هذه القيمة إلى دليل يمكن لمشروعك استخدامه لتخزين ملفات الإعدادات الخاصة بكل مستخدم.

    هذا النمط الشائع جدًا يستفيد من توسيع معاملات الشل (shell parameter expansion)، وهو أحد أنواع التوسيع العديدة التي يدعمها Bash. كما أنه يستخدم مواصفات دليل XDG الأساسي (XDG Base Directory Specification)، مما يساعد في الحفاظ على تنظيم دليل ملفاتك نظيفًا ومعياريًا.

    تضمن صيغة `:-` أن يكون هذا الجزء من القيمة إما $XDG_CONFIG_HOME—إذا كان مضبوطًا وغير فارغ—أو $HOME/.config بخلاف ذلك. توصي مواصفات XDG باستخدام $HOME/.config كقيمة افتراضية إذا كان XDG_CONFIG_HOME غير متاح؛ وهذا النمط يحترم ذلك.

    يستخدم Todo.txt، وهو سكربت شل يدير ملف قائمة مهام، هذا النمط لتحديد أحد المواقع التي يبحث فيها عن ملف الإعدادات الخاص به.

    تحديد موقع برنامج قابل للتنفيذ

    للتأكد من استيفاء تبعيات سكربتك بشكل مناسب

    لتحديد موقع ملف ثنائي من مجموعة من البدائل الممكنة، استخدم نمطًا كهذا:

    [[ -f Markdown.pl ]] && markdown_bin=./Markdown.pl 
        || markdown_bin=$(which Markdown.pl 2>/dev/null 
            || which markdown 2>/dev/null)
    

    يستخدم هذا النمط المنطق البولياني (boolean logic)، والتقصير الدائري (short-circuiting)، وعوامل الاختبار (test operators) للتحقق من شرط (وجود ملف Markdown.pl) لتعيين متغير باستخدام الملف الافتراضي أو بديل. يستخدم البديل أمر `which` لتحديد موقع أحد نسختين احتياطيتين محتملتين في مسار المستخدم الحالي.

    سيحتوي المتغير الناتج، markdown_bin، إما على مسار إلى الملف القابل للتنفيذ المناسب أو سلسلة نصية فارغة (التي يمكنك اختبارها باستخدام -n). يستخدم BashBlog، وهو نظام مدونة بسيط مكتوب في سكربت Bash واحد، هذا النمط لتوفير دعم اختياري لـ Markdown باستخدام البرنامج القياسي.

    إنشاء اسم ملف عشوائي

    عندما تحتاج إلى الكتابة في ملف جديد، ولكن لا يهمك اسمه، جرب هذا النمط:

    while [[ -f $out ]]; do out=${out%.html}.$RANDOM.html; done
    

    تستخدم حلقة `while` هذه عامل التشغيل `-f` مرة أخرى، مستفيدة أيضًا من المتغير الخاص RANDOM. الجزء الذكي هو التأكد من أن الملف غير موجود بالفعل، على الرغم من أنه حل بالقوة الغاشمة: فقط قم بإنشاء أسماء ملفات عشوائية حتى لا يكون أحدها موجودًا بالفعل.

    $RANDOM ليس أفضل نهج إذا كنت بحاجة إلى أرقام عشوائية حقيقية، ولكنه مناسب لهذا النوع من الاستخدام. في هذه الحالة بالذات، سيكون اسم الملف النهائي شيئًا مثل mypost.6592.html، mypost.26005.html، وهكذا.

    BashBlog يستخدم هذا النمط الشائع لإرسال المخرجات المولدة إلى ملف مؤقت.

    اشتراط متغير

    البرمجة الدفاعية ممارسة جيدة

    لضمان تعريف متغير قبل القيام بأي شيء آخر، استخدم هذا النمط:

    do_stuff() {
        [[ -z $global_variable ]] && return
    }
    

    إن الجمع بين `-z` لاختبار سلسلة نصية فارغة (empty string) وعامل الاختصار `&&` للعودة المبكرة (return early) مرن للغاية وينطبق على مجموعة واسعة من المواقف. في هذه الحالة بالذات، يُستخدم للتحقق من متغير عام (global variable) وإنهاء دالة مبكرًا. هذه ممارسة جيدة إذا كانت لديك دالة تعتمد على قيمة ولا يمكنها اتخاذ أي إجراء معقول بخلاف الفشل بشكل رشيق (failing gracefully).

    يمكنك أيضًا التحقق من وجود المعاملات الموضعية (positional parameters)، مما يجعلها مطلوبة إذا كنت ترغب في الخروج مبكرًا عند الفشل:

    [[ -z $1 ]] && return
    

    مرة أخرى، BashBlog يستخدم هذا النمط على نطاق واسع. كما يستخدمه Homebrew في هذا السكربت `brew`، والذي يتحقق من المتغيرات الشائعة مثل `BASH_VERSION` و`PWD` و`HOME`.

    تعيين المعاملات لمتغيرات محلية

    لأي شخص يتعين عليه صيانة الكود الخاص بك، بمن فيهم أنت

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

    foo() {
        username=$1
        name=$2
        ...
    }
    

    على عكس معظم لغات البرمجة، لا تدعم برمجة Bash المعاملات المسماة (named parameters)، سواء للبرامج أو للدوال. وبدلاً منها توجد المعاملات الموضعية (positional parameters)، مثل `$1` للإشارة إلى الأول، و`$2` للثاني، وهكذا. ولكن داخل سكربت أو دالة، خاصة تلك الطويلة، سرعان ما يصبح التعامل مع `$1` و`$2` محرجًا.

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

    إعادة تعيين المعلمات يساعد أيضًا على تجنب المشاكل عند معالجتها في حلقة تكرارية أو تغييرها باستخدام الأمر المدمج set. إذا كانت دالتك تستقبل اسم مستخدم في $1، فإن إعادة تعيينه يضمن توفره لاحقًا، بغض النظر عما يحدث للمتغير $1. كما أنه يساعد في حال احتجت يومًا إلى إعادة ترتيب معلمات دالتك؛ ففي هذه الحالة، ما عليك سوى تغيير التعيين الأولي في بداية الدالة، وليس كل استخدام للمتغير $1 داخلها.

    يستخدم سكربت nvm هذا النمط، وهو مستخدم على نطاق واسع في العديد من سكربتات shell.

    إعادة توجيه مخرجات عدة أوامر إلى ملف

    يمكن لهذا النمط أن يزيل الكثير من التكرار

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

    {
        command1
        command2
    } > filename
    

    سينفذ هذا النمط command1، ثم command2، مع إعادة توجيه مخرجات كل منهما إلى الملف المسمى filename. كلما زاد عدد الأوامر التي تحتاج إلى تشغيلها، زادت الفائدة التي تحصل عليها من عدم الاضطرار إلى تكرار اسم الملف وعامل إعادة التوجيه في كل مرة، كما أنه من الأسهل بكثير استخدام اسم ملف مختلف إذا احتجت لذلك.

    من المهم ملاحظة وجود صيغة تجميع مشابهة جدًا، باستخدام الأقواس بدلاً من الأقواس المعقوفة:

    (
        command1
        command2
    ) > filename
    

    الفرق هو أن هذه الأوامر تعمل الآن في صدفة فرعية (subshell)، مما يعني — على سبيل المثال — أن أي تعيينات للمتغيرات لن تكون متاحة خارج هذا التجميع.

    هناك فروق دقيقة إضافية في بناء الجملة، ولكن إذا استخدمت هذا التنسيق متعدد الأسطر، فلن تواجهها.

    معالجة ملف سطرًا بسطر

    التعامل مع الأمور خطوة بخطوة

    سيساعدك هذا النمط على معالجة ملفات الإعداد (config files)، ونصوص Markdown، وأنواع أخرى من الملفات النصية العادية. وهو مفيد بشكل خاص عندما يكون كل سطر في الملف مستقلاً إلى حد كبير عن البقية:

    while IFS='' read -r line; do
        ...
        command $line
        ...
    done < $filename
    

    هناك الكثير مما يحدث هنا، لذا سأشرحه شيئًا فشيئًا. يسترجع الأمر المدمج read البيانات من الإدخال القياسي (stdin) ويخزنها في متغير — `line` في هذه الحالة. يعيد قيمة خاطئة (false) عندما لا يكون هناك شيء للقراءة، لذا، بالاشتراك مع إعادة توجيه الإدخال من ملف مسمى، ستستمر الحلقة حتى يتم استهلاك جميع المدخلات. المتغير `IFS` (فاصل الحقول الداخلي)، في هذه الحالة، يؤثر على كيفية تعامل `read` مع المسافات البادئة/اللاحقة، مما يضمن الحفاظ عليها.

    استخدام heredocs للكتابة إلى ملف

    تبدو هذه الصيغة المحددة أكثر أناقة بكثير

    صيغة heredoc هي إحدى الصيغ التي ستجد سببًا لاستخدامها مرارًا وتكرارًا بمجرد إتقانها. لكنها أقوى مما قد تدرك، كما يوضح هذا النمط:

    bar() {
        cat <<- EOF > "$filename"
        Enter lines
        of text here
        EOF
    }
    

    تتيح لك مستندات الإدخال المضمنة (Here documents) توجيه أسطر متعددة من المدخلات، دون الحاجة إلى استخدام أي أحرف هروب معقدة أو تكرار بناء جملة معقد. ومع ذلك، فإن المستند المستخدم في هذا النمط أكثر تميزًا، حيث يتميز بخاصيتين مثيرتين للاهتمام.

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

    ثانيًا، يستخدم الأمر `cat` مع إعادة توجيه الإخراج لإرسال محتويات مستند الإدخال المضمن (heredoc) إلى ملف. هذا يجعل ملء ملف من خلال سكريبت أمرًا سهلاً للغاية، سواء كان ملف README، أو ملف إعدادات (config file)، أو أي شيء آخر.

    إذا كنت ترغب في استخدام توسيع المتغيرات داخل مستند إدخال مضمن (here doc)، فتأكد من ترك المحدد في السطر الأول بدون علامات اقتباس.

    قف على أكتاف العمالقة

    حاول استكشاف مشاريع Shell الشائعة على GitHub للاستلهام وتعلم تقنيات جديدة. إذا وجدت بناء جملة أو أمرًا معينًا لا تفهمه، فابحث عنه لفهم سبب استخدامه بهذه الطريقة. تعلم من مبرمجي Shell الآخرين، وستتحسن مهاراتك في كتابة السكريبتات مع مرور الوقت.

إتقان أنماط Bash لا يقتصر على معرفة الأوامر، بل يتعلق بفهم كيفية بناء سكربتات ذكية وقابلة للتوسع. كل نمط تتعلمه يضيف لك قوة حقيقية في التعامل مع المهام اليومية.

ابدأ بتطبيق هذه الأنماط تدريجيًا داخل مشاريعك، وستلاحظ تحسنًا واضحًا في الأداء والتنظيم. مع الوقت، ستصبح كتابة سكربتات Bash الاحترافية أمرًا طبيعيًا بالنسبة لك.

اقرأ أيضا:  6 أفضل الطرق للعثور على ملاحظات Outlook المفقودة
زر الذهاب إلى الأعلى