محتويات الدورة

لينكس / الأساسي: أسس سطر الأوامر / الدرس 6

التحكم في بيئة الصدفة والتوسعة

استخدم المتغيرات والبيئات المصدّرة والاقتباس والبحث عن الأوامر لجعل الجلسات قابلة للتوقع.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • التمييز بين متغيرات الصدفة ومدخلات البيئة المصدّرة.
  • توقع أثر الاقتباس وتقسيم الكلمات وتوسعة الأنماط.
  • ضبط إعدادات الجلسة والأسرار.

الإسناد جزء من صياغة الصدفة

لا يحتوي إسناد مثل project=demo مسافات حول علامة المساواة. أما project = demo فيطلب تشغيل أمر اسمه project. تُدرج توسعة "$project" القيمة وسيطاً واحداً بما فيها المسافات. يختلف المتغير غير المضبوط عن الفارغ في بعض التوسعات، لذلك يجب تحديد الافتراضيات عمداً. تستخدم ${name:-fallback} القيمة البديلة عند الغياب أو الفراغ. وتفصل الأقواس اسم المتغير عن النص التالي مثل "${project}_notes".

bash حفظ قيمة ذات مسافات واختيار افتراضي
project='sample notes'
printf '<%s>\n' "$project"
printf '%s\n' "${missing_lab_value:-draft}"
الناتج المتوقع
<sample notes>
draft

يتلقى printf الأول وسيطاً واحداً. تُستخدم القيمة البديلة إذا غاب missing_lab_value أو فرغ؛ اختر اسماً غير مستخدم داخل صدفة مختبر نظيفة.

يرث الأبناء القيم المصدّرة

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

bash تمرير قيمة إلى أمر ابن واحد
LAB_MODE=review bash -c 'printf "%s\n" "$LAB_MODE"'
printf '%s\n' 'parent values are not changed by the child'
الناتج المتوقع
review
parent values are not changed by the child

يتوفر إسناد LAB_MODE المؤقت داخل Bash الجديد لهذا الاستدعاء فقط. لا يمرر المثال أي اعتماد حقيقي.

يتحكم الاقتباس في التفسير

تحفظ علامات الاقتباس المفردة المحارف حرفياً. وتسمح المزدوجة بتوسعة المتغيرات واستبدال الأوامر مع منع تقسيم كلمات النتائج وتوسعة مساراتها المعتادة. قد ينقسم متغير غير مقتبس إلى كلمات ثم تتوسع أنماطه النجمية، فينتج عدد وسائط مفاجئ. لا يُعاد تحليل محتوى المتغير تلقائياً كصياغة صدفة؛ فالفاصلة المنقوطة داخل قيمة مقتبسة بيانات. تجنب eval لاختصار بناء الأوامر لأنه يضيف مرحلة تفسير. المصفوفات في Bash مناسبة لحفظ قائمة وسائط متغيرة.

PATH ومجلد العمل مختلفان

يمثل PATH قائمة بحث مفصولة بنقطتين لأسماء الأوامر التي لا تحوي شرطة مائلة. ولا يحدد مكان ملفات إدخال الأوامر. يختار الأمر الذي يحوي شرطة مائلة مساراً مباشرة. قد يقدّم وضع مجلد غير موثوق، خصوصاً الحالي، في PATH برنامجاً غير متوقع عند البحث. افحص type -a عند وجود تنفيذات متعددة. تخدم الأسماء المستعارة الراحة التفاعلية أساساً، فلا تجعل البرامج النصية تعتمد على اسم شخصي. استخدم أسماء موثقة وحدد المفسر صراحة عند الحاجة لميزات Bash.

اعرف ملف البدء المطبق

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

الأخطاء الشائعة وإصلاحها

تحول الإسناد إلى command not found

لماذا يحدث؟
وُضعت مسافات حول =.
كيف تصلحه؟
استخدم name=value واقتبس القيمة عند الحاجة.
كيف تتجنب تكراره؟
ميّز صياغة الإسناد من الكتابة العادية.

لا يرى الابن متغيراً

لماذا يحدث؟
لم يُصدّر متغير الصدفة.
كيف تصلحه؟
صدّر المتغير المحدد أو مرر إسناداً مؤقتاً.
كيف تتجنب تكراره؟
وثق عقد البيئة للبرامج الأبناء.

توسعت قيمة نجمية بصورة غير متوقعة

لماذا يحدث؟
تُركت التوسعة دون اقتباس.
كيف تصلحه؟
استخدم الاقتباس المزدوج أو مصفوفة وسائط Bash.
كيف تتجنب تكراره؟
عامل البيانات كوسائط لا كنص صدفة مولّد.

اختبر فهمك

1. ما الفرق بين $name في اقتباس مزدوج وفي اقتباس مفرد؟

اعرض الحل المشروح

يوسّع الاقتباس المزدوج المتغير ويحفظ الناتج وسيطاً واحداً. ويمرر المفرد علامة الدولار والأحرف حرفياً. وإذا احتوى name مسافة بقيت النتيجة المقتبسة مزدوجاً وسيطاً واحداً دون تقسيم.

2. يحتاج برنامج قيمة لابن واحد فقط. اختر بين تعديل دائم لملف البدء وإسناد مؤقت.

اعرض الحل المشروح

استخدم إسناداً مؤقتاً مثل LAB_MODE=review command. يُظهر الاعتماد بجوار الاستدعاء ويتجنب التأثير في البرامج اللاحقة غير المتعلقة. وإذا احتاجته أوامر متعددة فصدّره داخل برنامج نصي أو صدفة فرعية ذات نطاق مقصود.

أهم ما تعلمته

  • اقتبس توسعات البيانات ومرر قوائم الوسائط دون eval.
  • صدّر ما يحتاجه الأبناء فقط وافهم نطاق البدء.

المراجع الرسمية