إذا عثرت على هذه الصفحة أثناء البحث، فمن المحتمل أنك تحاول حل بعض المشكلات أثناء تشغيل bash.
ربما لا تقوم بيئة bash الخاصة بك بتعيين متغير بيئة ولا تفهم السبب. ربما تكون قد علقت شيئًا ما في ملفات تعريف أو ملفات تمهيد مختلفة أو جميع الملفات بشكل عشوائي حتى تعمل.
على أية حال، الهدف من هذه المذكرة هو توضيح الإجراء الخاص ببدء تشغيل bash بأبسط ما يمكن حتى تتمكن من التعامل مع المشكلات.
Диаграмма
يلخص هذا المخطط الانسيابي جميع العمليات عند تشغيل bash.
الآن دعونا نلقي نظرة فاحصة على كل جزء.
تسجيل الدخول شل؟
تحتاج أولاً إلى اختيار ما إذا كنت في غلاف تسجيل الدخول أم لا.
غلاف تسجيل الدخول هو الغلاف الأول الذي تدخله عند تسجيل الدخول لجلسة تفاعلية. لا يتطلب غلاف تسجيل الدخول اسم مستخدم وكلمة مرور. يمكنك فرض بدء تشغيل Shell تسجيل الدخول عن طريق إضافة علامة --login
عندما دعا bash
على سبيل المثال:
باش --تسجيل الدخول
تقوم قذيفة تسجيل الدخول بإعداد البيئة الأساسية عند بدء تشغيل bash shell لأول مرة.
تفاعلية؟
ثم عليك تحديد ما إذا كانت الصدفة تفاعلية أم لا.
ويمكن التحقق من ذلك من خلال وجود المتغير PS1
(يقوم بتثبيت وظيفة إدخال الأوامر):
إذا [ "${PS1-}"]؛ ثم صدى تفاعلي وإلا صدى غير تفاعلي
أو معرفة ما إذا تم تعيين الخيار -i
، باستخدام متغير واصلة خاصة -
في باش، على سبيل المثال:
$صدى$-
إذا كان هناك رمز في الإخراج i
، فالصدفة تفاعلية.
في قذيفة تسجيل الدخول؟
إذا كنت في واجهة تسجيل الدخول، فسيبحث bash عن الملف /etc/profile
ويعمل إذا كان موجودا.
ثم يبحث عن أي من هذه الملفات الثلاثة بالترتيب التالي:
~/.bash_profile ~/.bash_login ~/.profile
عندما يجد واحدة، فإنه يبدأ ويتخطى الآخرين.
في قذيفة تفاعلية؟
إذا كنت في Shell غير لتسجيل الدخول، فمن المفترض أنك كنت بالفعل في Shell لتسجيل الدخول، وتم تكوين البيئة وسيتم توريثها.
وفي هذه الحالة يتم تنفيذ الملفين التاليين بالترتيب، إن وجدا:
/etc/bash.bashrc ~/.bashrc
لا خيار؟
إذا لم تكن في غلاف تسجيل الدخول أو الصدفة التفاعلية، فستكون البيئة الخاصة بك فارغة بالفعل. وهذا يسبب الكثير من الارتباك (انظر أدناه حول وظائف cron).
في هذه الحالة ينظر باش إلى المتغير BASH_ENV
بيئتك ويقوم بإنشاء الملف المقابل المحدد هناك.
الصعوبات المشتركة وقواعد الإبهام
كرون الوظائف
95% من الحالات التي أقوم فيها بتصحيح أخطاء بدء تشغيل bash يكون السبب هو أن وظيفة cron لا تعمل كما هو متوقع.
هذه المهمة اللعينة يعمل بشكل جيد عندما أقوم بتشغيله في سطر الأوامر، لكنه يفشل عندما أقوم بتشغيله في crontab.
ومن سببان:
- وظائف كرون ليست تفاعلية.
- على عكس البرامج النصية لسطر الأوامر، لا ترث وظائف cron بيئة الصدفة.
عادةً لن تلاحظ أو تهتم بأن نص الصدفة ليس تفاعليًا لأن البيئة ترث من الصدفة التفاعلية. وهذا يعني أن كل شيء PATH
и alias
تكوينها كما كنت تتوقع.
هذا هو السبب في أنه من الضروري في كثير من الأحيان تعيين محدد PATH
لمهمة كرون مثل هنا:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
البرامج النصية تدعو بعضها البعض
مشكلة شائعة أخرى هي عندما يتم تكوين البرامج النصية عن طريق الخطأ للاتصال ببعضها البعض. على سبيل المثال، /etc/profile
مناشدات ل ~/.bashrc
.
يحدث هذا عادةً عندما يحاول شخص ما إصلاح بعض الأخطاء ويبدو أن كل شيء يعمل. لسوء الحظ، عندما تحتاج إلى فصل هذه الأنواع المختلفة من الجلسات، تنشأ مشاكل جديدة.
صورة عامل الحماية في وضع الحماية
لتجربة تشغيل الصدفة، قمت بإنشاء صورة Docker يمكن استخدامها لتصحيح أخطاء تشغيل الصدفة في بيئة آمنة.
تشغيل:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
يقع ملف Dockerfile
لفرض تسجيل الدخول ومحاكاة shell لتسجيل الدخول:
$ bash --login
لاختبار مجموعة من المتغيرات BASH_ENV
:
$ env | grep BASH_ENV
لتصحيح الأخطاء crontab
سيتم تنفيذ برنامج نصي بسيط كل دقيقة (في /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
المصدر: www.habr.com