Bash/advantages of the Bash

من موسوعة حسوب
مراجعة 18:16، 23 يوليو 2018 بواسطة أسامه-دمراني (نقاش | مساهمات) (إدخال أولي)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

1.2.1 صدفة bash هي الصدفة الافتراضية لنظام جنو

يوفّر مشروع GNU -إذ يشير الاسم إلى GNU's Not UNIX- أدواتٍ لإدارة النظم الشبيهة بنظام يونكس، وهي نظم التشغيل الحرة والمتوافقة مع معايير يونكس. وإحدى تلك الأدوات هي bash، صَدَفة متوافقة مع صدفة sh الأولى التي كتبها ستيفن بورن، وبها خصائص مفيدة من صدفتي Korn و C -اختصاراتهما ksh و csh على الترتيب-. وقد صُممت لتتوافق مع معيار IEEE POSIX P1003.2/ISO 9 945.2 للصدفات والبرامج.

كما أن بها مزايا محسّنة عن sh سواء للبرمجة أو الاستخدام التفاعلي (interactive use)، مثل تعديل سطر الأوامر (command line editing)، وتأريخ (history) غير محدود الحجم للأوامر السابقة، والتحكم في المهام (job control)، ووظائف الصدفة (shell functions)، والأوامر البديلة (aliases)، والمصفوفات المفهرسة (indexed arrays) بأحجام غير محدودة، والأعداد الصحيحة الحسابية بأي قاعدة من 2 وحتى 64. كذلك تستطيع bash التعامل مع أغلب شيفرات صدفة sh النصية دون تعديل.

وقد بدأت مبادرة bash في الأصل -مثل باقي مشاريع جنو- من أجل الحفاظ على حرية الاستخدام والدراسة والنسخ والتعديل وإعادة نشر البرامج، وتشجيع ونشر تلك الحقوق، إذ أن تلك الحقوق هي ما تحفّز الإبداع، وقد ظهر ذلك في المزايا الإضافية التي وفّرتها bash وليست موجودة في أي صدفة أخرى.

1.2.2 المزايا التي لا توجد إلا في bash

1.2.2.1 الاستدعاء Invocation

هناك العديد من الخيارات متعددة المحارف التي يمكنك استخدامها، إضافة إلى الخيارات وحيدة المحرف التي يمكن إعدادها باستخدام أمر set الموجود افتراضيًا في الصدفة. وسنتعرض في هذا التوثيق لبعض الخيارات الأخرى المشهورة، كما يمكنك أن تجد القائمة كاملة في دليل info، في Bash features ثم Invoking Bash.

1.2.2.2 ملفات بدء التشغيل في Bash

ملفات بدء التشغيل (startup files) هي شيفرات نصية (scripts) تقرؤها Bash وتنفِّذُها عند بدء التشغيل، ويصف الشرح التالي الطرق المختلفة لبدء الصدفة، وملفات بدء التشغيل التي تُقرأ بناءً على ذلك.

1.2.2.2.1 الاستدعاء كصدفة تسجيل دخول تفاعلية، أو مع login--

يُقصد بالتفاعلية أنك تستطيع إدخال أوامر، والصدفة هنا لا تعمل بسبب تفعيل شيفرة نصية، وتعني صدفة تسجيل الدخول أنك لا تدخل إلى الصدفة إلا بعد المصادقة (authenticating) مع النظام، غالبًا بإدخال اسم المستخدم الخاص بك وكلمة المرور.

الملفات المقروءة:

  • /etc/profile
  • ~/.bash_profile, ~/.bash_login or ~/.profile: يُقرأ أول ملف قابل للقراءة.
  • ~/.bash_logout عند تسجيل الخروج.

تُطبع رسائل خطأ إن كانت ملفات الإعداد (configuration files) موجودة لكن لا يمكن قراءتُها، وإن كان أحد الملفات غير موجود فإن bash تبحث عن الملف التالي.

1.2.2.2.2  الاستدعاء كصدفة تفاعلية بدون تسجيل دخول

تعني صدفة non-login أنك لم تضطر إلى المصادقة مع النظام، كما في حالة فتح الطرفية بالنقر على أيقونة أو عنصر في قائمة، فهذه هي صدفة non-login.

الملفات المقروءة:

  • ~/.bashrc

هذا الملف يشار إليه عادة في bash_profile/~:

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

انظر قسم البنى الشرطية في Bash للمزيد عن بنية if

1.2.2.2.3 الاستدعاء بشكل غير تفاعلي

تستخدم كل الشيفرات النصية صدَفات غير تفاعلية، وقد بُرمِجَت لتقوم بمهام محددة ولا يمكن برمجتها لتنفِّذَ مهامًا أخرى خلاف ذلك.

الملفات المقروءة:

  • تُحدَّد بواسطة BASH_ENV

لا يُستخدم PATH في هذا الملف من أجل البحث، فإن كنت تريد استخدامه فيُفضََل الإشارة إليه بذكر المسار الكامل واسم الملف.

1.2.2.2.4 الاستدعاء بأمر من داخل sh

تحاول Bash أن تتصرف كبرنامج sh القديم الذي كتبه ستيف بورن، في نفس الوقت الذي تحاول التوافق فيه مع معايير POSIX.

الملفات المقروءة:

  • /etc/profile
  • ~/.profile

يمكن لمتغير ENV أن يشير إلى معلومات بدء تشغيل (startup information) إضافية.

1.2.2.2.5 وضع POSIX

يتم تفعيل هذا الخيار باستخدام أمر set:

set -o posix

أو باستدعاء برنامج bash بخيار posix--، إذ ستحاول bash حينها أن تتوافق مع معايير POSIX للصَّدَفات. أيضًا، تعطي تهيئة متغير POSIXLY_CORRECT نفس النتيجة.

الملفات المقروءة:

  • يحددها متغير ENV.

1.2.2.2.6 الاستدعاء عن بعد

الملفات المقروءة حين تُبدأ bash باستخدام أمر rshd:

  • ~/.bashrc

تجنب استخدام r-tools

انتبه لأخطار استخدام أدوات غير آمنة مثل rlogin، وtelnet، وrsh، وrcp، إذ تنقل البيانات الحساسة عبر الشبكة بدون تشفير. فإن احتجت أدوات لإدارة النظام عن بعد أو نقل الملفات أو غير ذلك، فاستخدم أحد تطبيقات بروتوكول الصدَفة الآمنة (Secure SHell Protocol) -يشتهر ذلك البروتوكول باسم ssh-، والمتوفر مجانًا من http://www.openssh.org. ستجد كذلك برامج مختلفة أيضًا للأنظمة غير الشبيهة بيونكس، انظر المرآة المحلية للبرمجيات التي لديك (local software mirror).

1.2.2.2.7 الاستدعاء حين يكون المعرّف UID غير مطابق للمعرف EUID

لا تُقرأ أي ملفات عند بدء التشغيل في هذه الحالة.

1.2.2.3 الصدفات التفاعلية

1.2.2.3.1 ما هي الصدفة التفاعلية؟

تَقرأ أي صدفة تفاعلية وتَكتب في طرفية مستخدم ما كما يلي:

تتصل المدخلات والمخرجات بالطرفية، ويبدأ سلوك bash التفاعلي حين يُستدعى أمر bash دون إضافة أي وسائط غير خيارية (non-option arguments)، فيما عدا إن كان الخيار نصًا (string) تتم قراءته، أو حين تُشغَّل الصدفة لقراءة مُدخل قياسي (standard input)، والذي يسمح بتهيئة المعاملات الموضعية (positional parameters) (انظر بيئة Bash).

1.2.2.3.2 هل هذه الصدفة تفاعلية؟

لكي تعرف ما إن كانت الصدفة تفاعلية أم لا، انظر إلى محتوى المعامل الخاص (-)، فإن كان به "i" فإن الصدفة تفاعلية:

hsoub:~> echo $-

himBH

أما في الصدفة غير التفاعلية، فإن المحث PS1 يكون غير مهيأ، أي يعود إلى الصفر.

1.2.2.3.3 سلوك الصدفة التفاعلية

  • تقرأ bash ملفات بدء التشغيل (startup files).
  • التحكم في الوظائف مفعّل افتراضيًا.
  • المحثّات مهيأة، ومتغير البيئة PS2 مفعلٌّ للأوامر متعددة الأسطر، ويضبط عادة على "<"، وهو كذلك المحث الذي تحصل عليه حين تفترض الصدفة أنك أدخلت أمرًا غير مكتمل، مثل أن تنسى علامات تنصيص أو عنصر أو أكثر لا يمكن إهماله في أمر ما، ...إلخ.
  • تُقرأ الأوامر افتراضيًا من سطر الأوامر باستخدام readline.
  • تفسّر Bash خيار ignoreeof حين تتلقى End Of File (أو EOF اختصارًا) بدلًا من الخروج مباشرة.
  • تأريخ الأوامر وتوسعة السجل مفعّلان افتراضيًا، ويُحفظ السجل في ملف يشار إليه بواسطة HISTFILE حين تغلق الصدفة. ويشير HISTFILE افتراضيًا إلى bash_history./~
  • توسعة الأوامر البديلة (alias expansion) مفعّلة تلقائيًا.
  • يتم تجاهل إشارة SIGTERM في حالة غياب الأفخاخ (traps).
  • في غياب الأفخاخ (traps)، يتم التقاط SIGINT والتعامل معها، وبالتالي فإن الضغط على Ctrl+C مثلًا لن يُخرجك من الصدفة التفاعلية التي أنت فيها.
  • يمكن إعداد إشارات SIGHUP لتُرسَل إلى كل الوظائف عند الخروج، بواسطة خيار huponexit.
  • يتم تنفيذ الأوامر بمجرد قراءتها.
  • تتفقد bash البريد بشكل دوري.
  • يمكن ضبط Bash لتغلق حين تواجه متغيرات غير مرجعية (unreferenced variables). هذا السلوك معطّل في الوضع التفاعلي.
  • حين تواجه أوامر الصدفة أخطاء في إعادة التوجيه، فلن يتسبب ذلك في إغلاق الصدفة أو الخروج منها.
  • لا تتسبب الأخطاء المتكررة للأوامر المُضمَّنة الخاصة أثناء استخدامها في وضع POSIX بالخروج من الصدفة. انظر تنفيذ الأوامر في bash للمزيد عن الأوامر المدمجة.
  • فشل exec لن يتسبب في الخروج من الصدفة.
  • الأخطاء التركيبية للمحلِّل (Parser) لن تتسبب في إغلاق الصدفة.
  • التفقّد البسيط لوسائط (arguments) أمر cd مفعّل افتراضيًا.
  • الخروج التلقائي بعد انقضاء مدة يتم تحديدها في متغير TMOUT، مفعّل أيضًا.

مزيد من الشرح:

1.2.2.4 التعبيرات الشَّرطية Conditional Expressions

تُستخدم التعبيرات الشرطية عبر أمر ]] المجمَّع، والأمرين المُضمَّنيْن test و ] ، إضافة إلى الأوامر المُضمَّنة. وقد تكون التعبيرات أحادية أو ثنائية، فتُستخدم الأولى عادة لفحص حالة ملف ما، حيث يكون لديك عنصر واحد -ملف مثلًا- لإجراء العملية عليه.

هناك أيضًا عوامل نصية (string operators) وعوامل مقارنات عددية (numeric comparison operators)، وهذين النوعين هما العوامل الثنائية، حيث يتطلبان عنصرين لتنفيذ العملية عليهما.

فإن كان وسيط FILE لأحد الأصليين في هيئة dev/fd/N، فيتم اختيار واصفة الملف N، أما إن كان في إحدى تلك الهيئات dev/stdin/ أو dev/stdout/ أو dev/stderr/، فيتم اختيار واصفة الملف  0، 1، أو 2 على الترتيب.

انظر تفصيل الشرح عن البُني الشرطية للمزيد عن التعبيرات الشرطية، وللمزيد عن واصفات الملفات (file descriptors) انظر الحصول على مدخلات المستخدم في Bash

1.2.2.5 التعبيرات الحسابية في الصدفة Shell Arithmetic Expressions

تسمح الصدفة بتقييم التعبيرات الحسابية كإحدى توسعات الصدفة، أو باستخدام أمر let، ويتم التقييم في شكل أعداد صحيحة ثابتة العرض (fixed width integers) بدون تفقّد للفائض (overflow) ، باستثناء أن القسمة على 0 يتم التقاطها والإشعار بها كخطأ. وتنطبق قواعد لغة البرمجة C في شأن العوامل وأولوياتها (precedence) وترابطها (associativity) على مثيلاتها هنا، انظر بيئة bash.

1.2.2.6 الأوامر البديلة Aliases

تسمح الأوامر البديلة باستبدال كلمة بِنصٍّ مكون من عدة كلمات حين تُستخدم كأول كلمة من أمر بسيط، وتحتفظ الصدفة بقائمة من الأوامر البديلة التي يمكن إنشاؤها أو إلغاؤها باستخدام أمرَيْ alias و unalias.

وتقرأ Bash سطرًا كاملًا على الأقل من المدخلات قبل تنفيذ أي أوامر في ذلك السطر.

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

وكذلك تُوسَّع الأوامر البديلة عند قراءة وصف دالة ما، وليس عند تنفيذها، ذلك أن وصف الدالة نفسه عبارة عن أمر مُجمَّع (compound command)، ومن ثم فإن الأوامر البديلة الموجودة في دالة ما لا تكون متاحة إلا بعد تنفيذ تلك الدالة. وسوف نناقش الأوامر البديلة بالتفصيل في قسم الأوامر البديلة.

1.2.2.7 المصفوفات

توفر Bash متغيرات مصفوفة أحادية البُعد (one-dimensional array variables)، وأي متغير يمكن استخدامه كمصفوفة، وسيصرِّح أمر declare عن أي مصفوفة، كما أنه لا يوجد حد أقصى لحجم المصفوفة، ولا تتطلب أن تتم فهرسة عناصرها أو تُعيَّن متجاورة. كذلك، فإن المصفوفات هنا صفرية القاعدة (zero-based)، انظر فصل 10.

1.2.2.8 مُكدَّس المجلدات Directory Stack

هو قائمة لآخر المجلدات التي تم الدخول إليها، ويضيف أمر pushd المجلدات إلى المُكدَّس حيث يغيِّر المجلد الحالي، وأما popd فيزيل المجلدات المحددة من المُكدَّس ويغيّر المجلد الحالي إلى المجلد الذي أُزيل.

ويمكن عرض المحتوى باستخدام أمر dirs أو بالنظر في محتوى المتغير DIRSTACK، وستجد مزيدًا من المعلومات عن هذه الآلية في صفحات معلومات bash- أو Bash info pages-.

1.2.2.9 المحثّ The prompt

العمل مع المحثّ في Bash ممتع، انظر قسم التحكم في المحث داخل صفحات معلومات Bash.

1.2.2.10 الصدفة المحظورة

حين يتم تشغيل الصدفة كصدفة محظورة باستخدام أمر rbash أو مع خيار restricted-- أو r-، فإن ما يحدث هو التالي:

  • يتم تعطيل أمر cd.
  • لا يمكن ضبط أو إلغاء ضبط SHELL أو PATH أو ENV أو BASH_ENV.
  • لا يُسمح أن تحتوي أسماء الأوامر على شَرطة مائلة.
  • لا يُسمح بأسماء الملفات التي تحتوي شرطة مائلة مع أمر (source).
  • لا يقبل أمر hash أي شرطة مائلة مع خيار p-.
  • ميزة استيراد الدوال عند بدء التشغيل معطّلة.
  • يتم تجاهل SHELLOPTS عند بدء التشغيل.
  • إعادة توجيه الخَرج باستخدام <، |<، ><، &<، <&، << معطلة.
  • يتم تعطيل أمر exec.
  • يتم تعطيل خيارات f- وd- لأمر enable.
  • لا يمكن تحديد PATH افتراضي مع أمر command.
  • لا يمكن إيقاف الوضع المحظور.

حين يتم تنفيذ أمر يظهر أنه shell script فإن rbash يوقف أي محظورات في الصدفة التي فُتحت من أجل تنفيذ الشيفرة النصية.

مزيد من المعلومات: