ميزات صدفة Bash
صدفة 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 وليست موجودة في أي صدفة أخرى.
المزايا التي لا توجد إلا في bash
الاستدعاء Invocation
هناك العديد من الخيارات متعددة المحارف التي يمكنك استخدامها، إضافة إلى الخيارات وحيدة المحرف التي يمكن إعدادها باستخدام أمر set الموجود افتراضيًا في الصدفة. وسنتعرض في هذا التوثيق لبعض الخيارات الأخرى المشهورة، كما يمكنك أن تجد القائمة كاملة في دليل info
، في Bash features ثم Invoking Bash.
ملفات بدء التشغيل في Bash
ملفات بدء التشغيل (startup files) هي شيفرات نصية (scripts) تقرؤها Bash وتنفِّذُها عند بدء التشغيل، ويصف الشرح التالي الطرق المختلفة لبدء الصدفة، وملفات بدء التشغيل التي تُقرأ بناءً على ذلك.
الاستدعاء كصدفة تسجيل دخول تفاعلية، أو مع login--
يُقصد بالتفاعلية هنا هو أنك تستطيع إدخال أوامر، والصدفة لا تعمل بسبب تفعيل شيفرة نصية، وتعني "صدفة تسجيل الدخول" أنك لا تدخل إلى الصدفة إلا بعد المصادقة (authenticating) مع النظام، غالبًا بإدخال اسم المستخدم الخاص بك وكلمة المرور.
الملفات المقروءة:
etc/profile/
bash_profile./~
أوbash_login./~
أوprofile./~
: يُقرأ أول ملف قابل للقراءة.bash_logout./~
عند تسجيل الخروج.
تُطبع رسائل خطأ إن كانت ملفات الإعداد (configuration files) موجودة لكن لا يمكن قراءتُها، وإن كان أحد الملفات غير موجود فإن bash تبحث عن الملف التالي.
الاستدعاء كصدفة تفاعلية بدون تسجيل دخول
تعني صدفة non-login أنك لم تضطر إلى المصادقة مع النظام، كما في حالة فتح الطرفية بالنقر على أيقونة أو عنصر في قائمة، فتلك هي صدفة non-login.
الملفات المقروءة:
bashrc./~
هذا الملف يشار إليه عادة في bash_profile/~
:
if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
انظر البنى الشرطية في Bash للمزيد عن بنية if
الاستدعاء بشكل غير تفاعلي
تستخدم كل الشيفرات النصية صدَفات غير تفاعلية، وقد بُرمِجَت لتقوم بمهام محددة ولا يمكن برمجتها لتنفِّذَ مهامًا أخرى خلاف ذلك.
الملفات المقروءة:
- تُحدَّد بواسطة
BASH_ENV
لا يُستخدم PATH
في هذا الملف من أجل البحث، فإن كنت تريد استخدامه فيُفضََل الإشارة إليه بذكر المسار الكامل واسم الملف.
الاستدعاء بأمر من داخل sh
تحاول Bash أن تتصرف كبرنامج sh القديم الذي كتبه ستيف بورن، في نفس الوقت الذي تحاول التوافق فيه مع معايير POSIX.
الملفات المقروءة:
etc/profile/
profile./~
يمكن لمتغير ENV
أن يشير إلى معلومات بدء تشغيل (startup information) إضافية.
وضع POSIX
يتم تفعيل هذا الخيار باستخدام أمر set
:
set -o posix
أو باستدعاء برنامج bash بخيار posix--
، إذ ستحاول bash حينها أن تتوافق مع معايير POSIX للصَّدَفات. أيضًا، تعطي تهيئة متغير POSIXLY_CORRECT
نفس النتيجة.
الملفات المقروءة:
- يحددها متغير
ENV
.
الاستدعاء عن بعد
الملفات المقروءة حين تُبدأ bash باستخدام أمر rshd
:
bashrc/.~
تجنب استخدام r-tools
انتبه لأخطار استخدام أدوات غير آمنة مثل
rlogin
، وtelnet
، وrsh
، وrcp
، إذ تنقل البيانات الحساسة عبر الشبكة بدون تشفير. فإن احتجت أدوات لإدارة النظام عن بعد أو نقل الملفات أو غير ذلك، فاستخدم أحد تطبيقات بروتوكول الصدَفة الآمنة (Secure SHell Protocol) -يشتهر ذلك البروتوكول باسم ssh-، والمتوفر مجانًا من http://www.openssh.org. ستجد كذلك برامج مختلفة أيضًا للأنظمة غير الشبيهة بيونكس، انظر المرآة المحلية للبرمجيات التي لديك (local software mirror).
الاستدعاء حين يكون المعرّف UID غير مطابق للمعرف EUID
لا تُقرأ أي ملفات عند بدء التشغيل في هذه الحالة.
الصدفات التفاعلية
ما هي الصدفة التفاعلية؟
تَقرأ أي صدفة تفاعلية وتَكتب في طرفية مستخدم ما كما يلي:
تتصل المدخلات والمخرجات بالطرفية، ويبدأ سلوك bash التفاعلي حين يُستدعى أمر bash
دون إضافة أي وسائط غير خيارية (non-option arguments)، فيما عدا إن كان الخيار نصًا (string) تتم قراءته، أو حين تُشغَّل الصدفة لقراءة مُدخل قياسي (standard input)، والذي يسمح بتهيئة المعاملات الموضعية (positional parameters).
هل هذه الصدفة تفاعلية؟
لكي تعرف ما إن كانت الصدفة تفاعلية أم لا، انظر إلى محتوى المعامل الخاص -
، فإن كان به "i" فإن الصدفة تفاعلية:
hsoub:~> echo $-
himBH
أما في الصدفة غير التفاعلية، فإن المحث PS1
يكون غير مهيأ، أي يعود إلى الصفر.
سلوك الصدفة التفاعلية
- تقرأ 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
، مفعّل أيضًا.
التعبيرات الشَّرطية Conditional Expressions
تُستخدم التعبيرات الشرطية عبر أمر ]]
المجمَّع، والأمرين المُضمَّنيْن test
و ]
، إضافة إلى الأوامر المُضمَّنة. وقد تكون التعبيرات أحادية أو ثنائية، فتُستخدم الأولى عادة لفحص حالة ملف ما، حيث يكون لديك عنصر واحد -ملف مثلًا- لإجراء العملية عليه.
هناك أيضًا عوامل نصية (string operators) وعوامل مقارنات عددية (numeric comparison operators)، وهذين النوعين هما العوامل الثنائية، حيث يتطلبان عنصرين لتنفيذ العملية عليهما.
فإن كان وسيط FILE
لأحد الأصليين في هيئة dev/fd/N/
، فيتم اختيار واصفة الملف N، أما إن كان في إحدى تلك الهيئات dev/stdin/
أو dev/stdout/
أو dev/stderr/
، فيتم اختيار واصفة الملف 0، 1، أو 2 على الترتيب.
انظر تفصيل الشرح عن البُني الشرطية للمزيد عن التعبيرات الشرطية، وانظر الحصول على مدخلات المستخدم في Bash للمزيد عن واصفات الملفات (file descriptors).
التعبيرات الحسابية في الصدفة Shell Arithmetic Expressions
تسمح الصدفة بتقييم التعبيرات الحسابية كإحدى توسعات الصدفة، أو باستخدام أمر let، ويتم التقييم في شكل أعداد صحيحة ثابتة العرض (fixed width integers) بدون تفقّد للفائض (overflow) ، باستثناء أن القسمة على 0 يتم التقاطها والإشعار بها كخطأ. وتنطبق قواعد لغة البرمجة C في شأن العوامل وأولوياتها (precedence) وترابطها (associativity) على مثيلاتها هنا، انظر بيئة bash.
الأوامر البديلة Aliases
تسمح الأوامر البديلة باستبدال كلمة بِنصٍّ مكون من عدة كلمات حين تُستخدم كأول كلمة من أمر بسيط، وتحتفظ الصدفة بقائمة من الأوامر البديلة التي يمكن إنشاؤها أو إلغاؤها باستخدام أمرَيْ alias
و unalias
.
وتقرأ Bash سطرًا كاملًا على الأقل من المدخلات قبل تنفيذ أي أوامر في ذلك السطر. وكذلك، تُوسَّع الأوامر البديلة عند قراءة الأمر وليس عند تنفيذه، لهذا فإن كان حروف أحد الأوامر البديلة الموجودة في سطر ما مطابقة لحروف أمر آخر موجود في نفس السطر، فإنه لا يتم تنفيذ الأمر الذي يحمله الأمر البديل إلا عند قراءة السطر التالي من المدخلات.
وبالمثل تُوسَّع الأوامر البديلة عند قراءة وصف دالة ما، وليس عند تنفيذها، ذلك أن وصف الدالة نفسه عبارة عن أمر مُجمَّع (compound command)، ومن ثم فإن الأوامر البديلة الموجودة في دالة ما لا تكون متاحة إلا بعد تنفيذ تلك الدالة. وسوف نناقش الأوامر البديلة بالتفصيل في الأوامر البديلة.
المصفوفات
توفر Bash متغيرات مصفوفة أحادية البُعد (one-dimensional array variables)، وأي متغير يمكن استخدامه كمصفوفة، وسيصرِّح أمر declare
عن أي مصفوفة، كما أنه لا يوجد حد أقصى لحجم المصفوفة، ولا تتطلب أن تتم فهرسة عناصرها أو تُعيَّن متجاورة. كذلك، فإن المصفوفات هنا صفرية القاعدة (zero-based)، انظر المزيد حول المتغيرات في Bash.
مُكدَّس المجلدات Directory Stack
هو قائمة لآخر المجلدات التي تم الدخول إليها، ويضيف أمر pushd
المجلدات إلى المُكدَّس حيث يغيِّر المجلد الحالي، وأما popd
فيزيل المجلدات المحددة من المُكدَّس ويغيّر المجلد الحالي إلى المجلد الذي أُزيل.
ويمكن عرض المحتوى باستخدام أمر dirs
أو بالنظر في محتوى المتغير DIRSTACK
، وستجد مزيدًا من المعلومات عن هذه الآلية في صفحات دليل info
.
المحثّ The prompt
العمل مع المحثّ في Bash ممتع، انظر قسم التحكم في المحث (Controlling the Prompt) داخل صفحات دليل info
.
الصدفة المحظورة
حين يتم تشغيل الصدفة كصدفة محظورة باستخدام أمر rbash
أو مع خيار restricted--
أو r-
، فإن ما يحدث هو التالي:
- يتم تعطيل أمر
cd
. - لا يمكن ضبط أو إلغاء ضبط
SHELL
أوPATH
أوENV
أوBASH_ENV
. - لا يُسمح أن تحتوي أسماء الأوامر على شَرطة مائلة.
- لا يُسمح بأسماء الملفات التي تحتوي شرطة مائلة مع أمر
source
. - لا يقبل أمر
hash
أي شرطة مائلة مع خيارp-
. - ميزة استيراد الدوال عند بدء التشغيل معطّلة.
- يتم تجاهل
SHELLOPTS
عند بدء التشغيل. - إعادة توجيه الخَرج باستخدام
<
،|<
،><
،&<
،<&
،<<
معطلة. - يتم تعطيل أمر
exec
. - يتم تعطيل خيارات
f-
وd-
لأمرenable
. - لا يمكن تحديد
PATH
افتراضي مع أمرcommand
. - لا يمكن إيقاف الوضع المحظور.
- حين يتم تنفيذ أمر يظهر أنه shell script فإن
rbash
يوقف أي محظورات في الصدفة التي فُتحت من أجل تنفيذ الشيفرة النصية.
للمزيد عن إعادة التوجيه، انظر Info Bash-> Basic Shell Features-> Redirections.
انظر أيضًا
مصادر
- الحصول على مدخلات المستخدم في bash، انظر قسم إعادة التوجيه.
- صفحة مزايا صدفة Bourne Again SHell في مشروع توثيق لينكس.