شيبانغ (يونكس)
في مجال الحوسبة ، يُعرف تسلسل الأحرف # !، الذي يتكون من علامة الرقم (المعروفة أيضًا باسم # أو #) وعلامة التعجب ( المعروفة أيضًا باسم bang) ، باسم shebang ، ويقع في بداية النص البرمجي . ويُطلق عليه أيضًا اسم sharp - exclamation أو sha - bang أو hashbang أو pound - bang أو hash - pling .
عند استخدام ملف نصي يحتوي على سطر shebang كما لو كان ملفًا تنفيذيًا في نظام تشغيل شبيه بنظام يونكس ، يقوم مُحمِّل البرامج بتحليل السطر الأول من الملف كأمر للمُفسِّر. يُنفِّذ المُحمِّل برنامج المُفسِّر المُحدَّد ، مُمرِّرًا إليه المسار الذي استُخدم في البداية عند محاولة تشغيل البرنامج النصي، ليتمكن البرنامج من استخدام الملف كبيانات إدخال. [ 8 ] على سبيل المثال، إذا كان اسم البرنامج النصي هو المسار path /to/script ، ويبدأ بالسطر /bin/sh #!/bin/sh، فسيتم توجيه مُحمِّل البرامج لتشغيل البرنامج /bin/sh ، مع تمرير path/to/script كأول وسيط.
عادةً ما يتجاهل المفسر سطر shebang، لأن رمز "#" يُستخدم كعلامة تعليق في العديد من لغات البرمجة النصية؛ وقد تتجاهل بعض مترجمات اللغات التي لا تستخدم علامة التجزئة لبدء التعليقات سطر shebang إدراكًا منها لغرضه. [ 9 ]
بناء الجملة
يكون شكل توجيه المفسر shebang كما يلي: [ 8 ]
#! interpreter [ optional-one-arg-only ]
حيث يمثل المفسر مسارًا إلى برنامج قابل للتنفيذ. وجود مسافة بين #! والمفسر اختياري . يمكن إضافة أي عدد من المسافات أو علامات الجدولة قبل أو بعد المفسر . سيشمل الوسيط الاختياري أي مسافات إضافية حتى نهاية السطر.
في نظام لينكس ، يمكن تنفيذ الملف المحدد بواسطة المفسر إذا كان لديه حقوق التنفيذ وكان أحد الملفات التالية:
- ملف تنفيذي أصلي، مثل ملف ELF ثنائي
- أي نوع من الملفات التي تم تسجيل مترجم لها عبر آلية binfmt_misc (مثل تشغيل ملفات Microsoft .exe الثنائية باستخدام wine )
- نص آخر يبدأ بـ shebang
في أنظمة لينكس ومينيكس ، يمكن أن يكون المفسر عبارة عن نص برمجي. ينتج عن سلسلة من عبارات shebang و wrappers ملف قابل للتنفيذ مباشرةً، حيث يستقبل النصوص البرمجية التي تمت مصادفتها كمعاملات بترتيب عكسي. على سبيل المثال، إذا كان الملف /bin/A ملفًا قابلًا للتنفيذ بتنسيق ELF ، وكان الملف /bin/B يحتوي على عبارة shebang #!/bin/A optparam، وكان الملف /bin/C يحتوي على عبارة shebang #!/bin/B، فإن تنفيذ الملف /bin/C سيؤدي إلى تنفيذ الأمر shebang /bin/B /bin/C، والذي بدوره سيؤدي إلى تنفيذ الأمر shebang /bin/A optparam /bin/B /bin/C.
في أنظمة التشغيل المشتقة من Solaris و Darwin (مثل macOS )، يجب أن يكون الملف المحدد بواسطة المفسر ملفًا تنفيذيًا ثنائيًا ولا يمكن أن يكون نصًا برمجيًا بحد ذاته. [ 10 ]
إذا تم استدعاء البرنامج النصي عن طريق استدعاء المفسر صراحةً، #!فلن يتم الرجوع إلى السطر. على سبيل المثال، إذا script.shكان السطر الأول في البرنامج النصي هو #!/usr/games/nibbles، فلن يحاول تشغيل البرنامج النصي sh script.shفتح البرنامج النصي في nibbles، بل ./script.shسيحاول فتحه في .
أمثلة
بعض عبارات شيبانغ النموذجية:
#!/bin/sh- قم بتشغيل الملف باستخدام Bourne shell ، أو shell متوافق، على افتراض وجوده في الدليل /bin#!/bin/bash– قم بتنفيذ الملف باستخدام Bash shell#!/usr/bin/pwsh– قم بتنفيذ الملف باستخدام PowerShell#!/usr/bin/env python3– قم بالتنفيذ باستخدام مترجم بايثون ، وذلك باستخدام مسار البحث عن البرنامج في متغير البيئة للعثور عليه.#!/bin/false- لا تفعل شيئًا، ولكن أعد حالة خروج غير صفرية ، مما يشير إلى الفشل. يُستخدم هذا الخيار لمنع التنفيذ المستقل لملف نصي مُصمم للتنفيذ في سياق مُحدد، مثل تنفيذه بواسطة.أمر من sh/bash،sourceأو من csh/tcsh، أو كملف .profile أو .cshrc أو .login.
قد تتضمن أسطر Shebang خيارات محددة تُمرر إلى المفسر. مع ذلك، تختلف التطبيقات في سلوك تحليل الخيارات؛ ولضمان قابلية النقل، يجب تحديد خيار واحد فقط دون أي مسافات بيضاء مضمنة. [ 11 ] تجدون المزيد من إرشادات قابلية النقل أدناه.
غاية
تسمح توجيهات المفسر باستخدام البرامج النصية وملفات البيانات كأوامر، مما يخفي تفاصيل تنفيذها عن المستخدمين والبرامج الأخرى، عن طريق إزالة الحاجة إلى إضافة بادئة المفسر إلى البرامج النصية في سطر الأوامر.
على سبيل المثال، لنفترض وجود نص برمجي يبدأ بالسطر التالي #!/bin/sh -x. يمكن استدعاؤه ببساطة عن طريق تحديد مسار ملفه، مثل some/path/to/foo[ 12 ] ، وبعض المعاملات، مثل barو baz:
بعض/المسار/إلى/بار الطعام باز
في هذه الحالة /bin/sh، يتم استدعاء الأمر بدلاً منه، مع المعاملات -x، some/path/to/foo، bar، و baz، كما لو كان الأمر الأصلي قد تم تنفيذه
/bin/sh -x some/path/to/foo bar baz
تُتيح معظم المفسرات إمكانية الوصول إلى أي وسائط إضافية للبرنامج النصي. إذا /bin/shكان `is` غلافًا متوافقًا مع POSIX ، فسيتم تقديم `is` barو` bazis` إلى البرنامج النصي كمصفوفة معلمات موضعية "$@"، وعلى حدة كمعلمات `is` "$1"و`is` "$2"على التوالي.
لأن الرمز # في بداية سطر الأوامر يُستخدم لإدخال التعليقات في لغة POSIX shell (وفي اللغات التي تفهمها العديد من المفسرات الأخرى)، فإن المفسر يتجاهل سطر shebang بالكامل. مع ذلك، يبقى للمفسر حرية تجاهل سطر shebang، وليس جميعها تفعل ذلك؛ لذا، فإن البرنامج النصي المكون من السطرين التاليين يُخرج السطرين معًا عند تشغيله:
#!/bin/cat مرحبا بالعالم!
نقاط القوة
بالمقارنة مع استخدام قوائم الربط العامة بين امتدادات الملفات وتطبيقات الترجمة، تتيح طريقة توجيه المترجم للمستخدمين استخدام مترجمات غير معروفة على مستوى النظام، ودون الحاجة إلى صلاحيات المسؤول. كما تتيح اختيار مترجم محدد، دون إثقال مساحة أسماء امتدادات الملفات (حيث يشير امتداد ملف واحد إلى أكثر من نوع ملف)، وتسمح بتغيير لغة تنفيذ البرنامج النصي دون تغيير صيغة استدعائه بواسطة برامج أخرى. لا يحتاج مستدعو البرنامج النصي إلى معرفة لغة التنفيذ، لأن البرنامج النصي نفسه مسؤول عن تحديد المترجم المستخدم.
سهولة الحمل
موقع البرنامج
يجب أن تحدد سطور Shebang مسارات مطلقة (أو مسارات نسبية إلى دليل العمل الحالي ) لملفات النظام التنفيذية؛ وهذا قد يُسبب مشاكل في الأنظمة ذات بنية نظام ملفات غير قياسية . حتى عندما تكون مسارات الأنظمة قياسية إلى حد كبير، فمن الممكن تمامًا أن تحتوي إصدارات مختلفة من نظام التشغيل نفسه على مواقع مختلفة للمفسر المطلوب. على سبيل المثال، قد يكون بايثون موجودًا في /usr/bin/python3 أو /usr/local/bin/python3 أو حتى في مسار مثل /home/username/bin/python3 إذا قام بتثبيته مستخدم عادي.
توجد مشكلة مماثلة في غلاف POSIX ، حيث اشترط POSIX أن يكون اسمه sh فقط ، دون تحديد مسار. القيمة الشائعة هي /bin/sh ، لكن بعض الأنظمة، مثل Solaris، تستخدم غلاف POSIX المتوافق في المسار /usr/xpg4/bin/sh . [ 13 ] في العديد من أنظمة Linux ، يُعد /bin/sh رابطًا ثابتًا أو رمزيًا إلى /bin/bash ، وهو غلاف Bourne Again (BASH). كما أن استخدام صيغة Bash مع الحفاظ على سطر shebang الذي يشير إلى sh غير قابل للنقل. [ 14 ]
لهذا السبب، قد يتطلب الأمر أحيانًا تعديل سطر shebang بعد نسخ نص برمجي من جهاز كمبيوتر إلى آخر، لأن المسار المُبرمج في النص قد لا ينطبق على الجهاز الجديد، وذلك تبعًا لمدى اتساق طريقة وضع المفسر في الإصدارات السابقة. ولهذا السبب، ولأن معيار POSIX لا يُوحّد أسماء المسارات، فإنه لا يُوحّد هذه الميزة أيضًا. [ 15 ] يمكن لأداة GNU Autoconf اختبار دعم النظام باستخدام الماكرو AC_SYS_INTERPRETER. [ 16 ]
في كثير من الأحيان، يمكن استخدام البرنامج /usr/bin/env لتجاوز هذا القيد عن طريق إدخال مستوى من التوجيه غير المباشر . يتبعه /usr/bin/env ، متبوعًا بالأمر المطلوب بدون المسار الكامل، كما في هذا المثال:#!
#!/usr/bin/env sh
يعمل هذا في الغالب لأن المسار /usr/bin/env يستخدم بشكل شائع لأداة env ، وهو يستدعي أول ملف sh موجود في متغير البيئة $PATH الخاص بالمستخدم ، وعادة ما يكون /bin/sh .
هذا المثال تحديدًا (باستخدام sh ) ذو فائدة محدودة: فكل من /bin/sh و /usr/bin/env ليسا عالميين، إذ يفتقر عدد مماثل من الأجهزة إلى كل منهما. وبشكل أعم، لا يزال استخدام #!/usr/bin/env لأي برنامج نصي يُسبب بعض مشاكل التوافق مع OpenServer 5.0.6 و Unicos 9.0.2 اللذين يحتويان على /bin/env فقط ولا يحتويان على /usr/bin/env .
يؤدي استخدام #!/usr/bin/env إلى توجيه غير مباشر في وقت التشغيل ، مما قد يؤدي إلى تدهور أمان النظام؛ ولهذا السبب يوصي بعض المعلقين بعدم استخدامه [ 17 ] في البرامج المعبأة، وحصره فقط في "الأمثلة التعليمية".
تقسيم الحجج
تُقسّم وسائط الأوامر بطرق مختلفة عبر المنصات. بعض الأنظمة لا تُقسّم الوسائط؛ على سبيل المثال، عند تشغيل البرنامج النصي باستخدام السطر الأول،
#!/usr/bin/env python3 -c
يُعامل كل النص الذي يلي المسافة الأولى كمعامل واحد، أي أنه يُمرر python3 -cكمعامل واحد إلى /usr/bin/env ، بدلاً من معاملين. تشمل هذه الأنظمة لينكس [ 18 ] [ 19 ] وسيجوين .
ثمة نهج آخر يتمثل في استخدام غلاف برمجي . فقد أضاف نظام FreeBSD 6.0 (2005) خيارًا -S إلى بيئة التشغيل الخاصة به ، وذلك بتغيير سلوك قراءة سطر shebang إلى عدم تقسيم السلسلة. يُخبر هذا الخيار بيئة التشغيل بتقسيم السلسلة بنفسها. [ 20 ] كما تتضمن أداة بيئة التشغيل GNU منذ الإصدار coreutils 8.30 (2018) هذه الميزة أيضًا. [ 21 ] مع أن استخدام هذا الخيار يُخفف من مشكلة قابلية النقل على مستوى النواة فيما يتعلق بالتقسيم، إلا أنه يُضيف شرطًا بأن تدعم بيئة التشغيل هذا الامتداد تحديدًا.
تفسير الشخصية
تتمثل مشكلة أخرى في احتواء النصوص البرمجية على حرف إرجاع السطر مباشرةً بعد سطر shebang، ربما نتيجةً لتحريرها على نظام يستخدم فواصل الأسطر في نظام DOS ، مثل نظام التشغيل Microsoft Windows . تفسر بعض الأنظمة حرف إرجاع السطر كجزء من أمر المفسر ، مما يؤدي إلى ظهور رسالة خطأ . [ 22 ]
الرقم السحري
إنّ سطر shebang هو في الواقع نسخة قابلة للقراءة من رقم سحري في الملف التنفيذي، وهو سلسلة البايتات السحرية 0x23 0x21 ، وهي ترميز الحرفين #! في نظام ASCII . يتم اكتشاف هذا الرقم السحري بواسطة عائلة دوال " exec "، التي تحدد ما إذا كان الملف نصًا برمجيًا أم ملفًا تنفيذيًا ثنائيًا. يؤدي وجود سطر shebang إلى تنفيذ الملف التنفيذي المحدد، والذي يكون عادةً مترجمًا للغة النص البرمجي. وقد زُعم [ 23 ] أن بعض الإصدارات القديمة من يونكس تتوقع أن يتبع سطر shebang مسافة وشرطة مائلة ( )، ولكن يبدو أن هذا غير صحيح؛ [ 11 ] بل جرت العادة على السماح بوجود مسافات بعد سطر shebang، ويتم توثيقها أحيانًا بمسافة، كما هو موضح في البريد الإلكتروني التاريخي لعام 1980 أدناه.#! /
تُمثَّل أحرف سطر الشيبان بنفس البايتين في ترميزات ASCII الموسعة ، بما في ذلك UTF-8 ، وهو الترميز الشائع استخدامه في البرامج النصية وملفات النصوص الأخرى على أنظمة يونكس الحالية. مع ذلك، قد تبدأ ملفات UTF-8 بعلامة ترتيب البايتات الاختيارية (BOM)؛ فإذا اكتشفت دالة "exec" تحديدًا البايتين 0x23 و 0x21 ، فإن وجود علامة BOM ( 0xEF 0xBB 0xBF ) قبل سطر الشيبان سيمنع تنفيذ مُفسِّر البرنامج النصي. يوصي بعض الخبراء بعدم استخدام علامة ترتيب البايتات في برامج POSIX النصية (الأنظمة الشبيهة بيونكس)، [ 24 ] لهذا السبب ولأسباب تتعلق بالتوافقية والفلسفة العامة. إضافةً إلى ذلك، فإن علامة ترتيب البايتات غير ضرورية في UTF-8، لأن هذا الترميز لا يُعاني من مشاكل في ترتيب البايتات ؛ فهي تُستخدم فقط لتحديد الترميز على أنه UTF-8. [ 24 ]
أصل الكلمة
يُطلق على الملف التنفيذي الذي يبدأ بتوجيه للمفسر اسم "نص برمجي"، وغالبًا ما يُسبق باسم المفسر المقصود أو تصنيفه العام. وقد يكون اسم "shebang" ( الاسم المكون من حرفين مميزين) مشتقًا من اختصار غير دقيق لعبارتي SHArp bang أو haSH bang ، وهما الاسمان الشائعان لهما في أنظمة يونكس. وهناك نظرية أخرى حول " sh" في "shebang" وهي أنها مشتقة من أمر الصدفة الافتراضي sh ، الذي يُستدعى عادةً باستخدام "shebang". [ 25 ] كان هذا الاستخدام شائعًا بحلول ديسمبر 1989، [ 26 ] وربما قبل ذلك.
تاريخ
أُضيفت خاصية "shebang" بواسطة دينيس ريتشي بين الإصدارين السابع والثامن من نظام التشغيل يونكس في مختبرات بيل. كما أُضيفت إلى إصدارات BSD من قسم أبحاث علوم الحاسوب في جامعة بيركلي (موجودة في الإصدار 2.8BSD [ 27 ] ومفعلة افتراضيًا في الإصدار 4.2BSD). ولأن الإصدار الثامن من يونكس من مختبرات بيل التابعة لشركة AT&T، والإصدارات اللاحقة، لم تُطرح للجمهور، فقد كان أول ظهور معروف لهذه الخاصية على نطاق واسع في نظام BSD.
يُلاحظ غياب توجيهات المفسر، مع دعم نصوص الصدفة، في وثائق الإصدار السابع من يونكس عام ١٩٧٩ [ ٢٨ ]، والتي تصف بدلاً من ذلك آلية في صدفة بورن حيث تُعالج الملفات ذات صلاحية التنفيذ بشكل خاص بواسطة الصدفة، التي تقوم (أحيانًا اعتمادًا على الأحرف الأولى في النص، مثل ":" أو "#") بإنشاء صدفة فرعية تُفسر وتُنفذ الأوامر الموجودة في الملف. في هذا النموذج، لا تتصرف النصوص كأوامر عادية إلا إذا تم استدعاؤها من داخل صدفة بورن. محاولة تنفيذ مثل هذا الملف مباشرةً عبر استدعاء النظام exec() الخاص بنظام التشغيل ستفشل، مما يمنع النصوص من التصرف بشكل موحد كأوامر نظام عادية.
تم تحسين البرامج النصية للصدفة في الإصدار 8
في الإصدارات اللاحقة من الأنظمة الشبيهة بنظام يونكس، تم إزالة هذا التناقض. قدم دينيس ريتشي دعم النواة لتوجيهات المفسر في يناير 1980، للإصدار 8 من يونكس ، مع الوصف التالي: [ 29 ]
من uucp الخميس 10 يناير 01:37:58 1980 من dmr الخميس 10 يناير 1980 الساعة 04:25:49 بعيدًا عن البحث تم تغيير النظام بحيث إذا تم تنفيذ ملف يبدأ بالرموز السحرية #!، وبقية السطر مفهومة ليكون اسم مترجم للملف المنفذ. في السابق (ولا يزال في الواقع) كانت القشرة تقوم بالكثير من هذه المهمة؛ تم تشغيله تلقائيًا على ملف نصي في وضع التنفيذ عندما تم كتابة اسم ملف النص كأمر. يؤدي إدخال هذه المنشأة في النظام إلى ما يلي فوائد. 1) يجعل ذلك البرامج النصية أقرب إلى الملفات التنفيذية الحقيقية، لأنها يمكن أن تكون موضوعًا لكلمة "تنفيذي". 2) إذا قمت بتنفيذ الأمر 'ps' أثناء تشغيل مثل هذا الأمر، فسيكون ذلك حقيقياً يظهر الاسم بدلاً من 'sh'. وبالمثل، تتم المحاسبة على أساس الاسم الحقيقي. 3) يمكن تعيين معرف المستخدم (set-user-ID) في البرامج النصية (Shell scripts). [ أ ] 4) من الأسهل توفير أغلفة بديلة؛ على سبيل المثال، إذا كنت تحب بيركلي سي إس إتش، فلا شك في ذلك. أي نوع من أنواع الصدفة يُستخدم لتفسير الملف. 5) سيسمح ذلك للمترجمين الآخرين بالاندماج بسلاسة أكبر. للاستفادة من هذه الفرصة الرائعة، يضع #! /bin/sh في الهامش الأيسر للسطر الأول من نصوص shell الخاصة بك. لا بأس بوجود فراغات بعد علامة التعجب (!). استخدم مسارًا كاملاً (لن يتم إجراء بحث). في الوقت الحالي، يقتصر السطر بأكمله على 16 حرفًا، ولكن سيتم رفع هذا الحد.
ميزة البرامج النصية غير المسماة
لكن مبتكر هذه الميزة لم يطلق عليها اسمًا: [ 31 ]
من: "ريتشي، دينيس م (دينيس)** CTR **" <dmr@[redacted]> إلى: <[redacted]@ talisman.org > التاريخ: الخميس، 19 نوفمبر 2009 18:37:37 -0600 الموضوع: رد: ما هو اسم خط #!<something> الخاص بك ؟ لا أتذكر أننا أطلقنا عليه اسماً مناسباً قط. لقد دخل في وقت متأخر جدًا - أعتقد أنني استلهمت الفكرة من شخص ما في أحد مؤتمرات جامعة كاليفورنيا في بيركلي على نظام يونكس في بيركلي؛ ربما كنت من أوائل من فعلوا ذلك قمت بتثبيته فعلياً، لكنها كانت فكرة خطرت ببالي. من مكان آخر. أما بالنسبة للاسم: فربما يكون شيئاً وصفياً مثل "هاش بانغ" على الرغم من أن هذا له نكهة بريطانية خاصة، لكن على أي حال، لا أتذكر أنني استخدمت اسمًا دلعًا على وجه الخصوص لأغراض البناء. انتشر دعم النواة لتوجيهات المفسر إلى إصدارات أخرى من يونكس، ويمكن رؤية أحد التطبيقات الحديثة في مصدر نواة لينكس في fs/binfmt_script.c . [ 32 ]
تتيح هذه الآلية استخدام البرامج النصية في أي سياق تقريبًا يُمكن فيه استخدام البرامج المُجمّعة العادية، بما في ذلك كبرامج نظام كاملة، وحتى كمُفسّرات لبرامج نصية أخرى. مع ذلك، تجدر الإشارة إلى أن بعض الإصدارات المبكرة من دعم النواة حدّت من طول توجيه المُفسّر إلى حوالي 32 حرفًا (16 حرفًا فقط في أول تطبيق لها)، أو فشلت في فصل اسم المُفسّر عن أي مُعاملات في التوجيه، أو كانت بها عيوب أخرى. إضافةً إلى ذلك، تسمح بعض الأنظمة الحديثة بتقييد الآلية بأكملها أو تعطيلها لأغراض أمنية (على سبيل المثال، تم تعطيل دعم تعيين مُعرّف المستخدم للبرامج النصية على العديد من الأنظمة).
لاحظ أنه حتى في الأنظمة التي تدعم نواة النظام بشكل كامل الرقم السحري #!، فإن بعض البرامج النصية التي تفتقر إلى توجيهات المفسر (مع أنها عادةً ما تتطلب إذن التنفيذ) لا تزال قابلة للتشغيل بفضل آلية معالجة البرامج النصية القديمة في Bourne shell، والتي لا تزال موجودة في العديد من إصداراتها الحديثة. ثم يتم تفسير هذه البرامج النصية بواسطة shell الافتراضي للمستخدم.
انظر أيضاً
ملحوظات
- ↑ تم تعطيل ميزة setuid في معظم أنظمة التشغيل الحديثة بعد إدراك إمكانية استغلال حالة التزامن لتغيير البرنامج النصي أثناء معالجته. [ 30 ]
مراجع
- ↑ "دليل برمجة باش المتقدمة: الفصل الثاني. البداية القوية" . مؤرشف من الأصل بتاريخ 10 ديسمبر 2019. تم الاطلاع عليه بتاريخ 10 ديسمبر 2019 .
- ↑ كوبر، مندل (5 نوفمبر 2010). دليل برمجة باش المتقدمة 5.3 المجلد 1. lulu.com. ص 5. ISBN 978-1-4357-5218-4.
- ↑ ماكدونالد، ماثيو (2011). HTML5: الدليل المفقود . سيباستوبول، كاليفورنيا: أورايلي ميديا . ص 373. ISBN 978-1-4493-0239-9.
- ↑ لوتز، مارك (سبتمبر 2009). تعلم بايثون ( الطبعة الرابعة). دار نشر أورايلي ميديا . ص 48. ISBN 978-0-596-15806-4.
- ↑ غولييش، غوندافارام وبيرزنيكس، سكوت، شيشير وغونتر (29 يوليو 2000). برمجة الصور المولدة بالحاسوب باستخدام بيرل ( الطبعة الثانية). أورايلي ميديا . ص 358. ISBN 978-1-56592-419-2.
{{cite book}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ^ لي هيتلاند ، ماغنوس (4 أكتوبر 2005). بداية بايثون: من المبتدئ إلى الاحترافي Apress. ص. 21. رقم ISBN 978-1-59059-519-0.
- ↑ شيتكا، جون (24 ديسمبر 2002). دليل لينكس+ للحصول على شهادة لينكس . كورس تكنولوجي. ص 353. ISBN 978-0-619-13004-6.
- 1 2 "execve(2) - صفحة دليل لينكس" . تم الاطلاع عليه بتاريخ 21 أكتوبر 2010 .
- ↑ "SRFI 22" .
- ↑ "Python - Python3 shebang line not working as expected" .
- 1 2 ماشيك، سفين (30 ديسمبر 2010). "سحر #!، تفاصيل حول آلية shebang/hash-bang: هل يلزم ترك مسافة بعد #!؟" . www.in-ulm.de . تاريخ الاسترجاع: 18 يناير 2024 .
- ↑ إذا سمحت بتات أذونات تنفيذ الملف بذلك
- ↑ "مواصفات المجموعة المفتوحة الأساسية، الإصدار 7" . 2008. تم الاطلاع عليه في 5 أبريل 2010 .
- ↑ "pixelbeat.org: أخطاء شائعة في كتابة سكربتات سطر الأوامر" .
من الأفضل بكثير اختبار السكربتات مباشرةً في بيئة سطر أوامر متوافقة مع معيار POSIX إن أمكن. خيار `bash --posix` غير كافٍ لأنه لا يزال يقبل بعض خصائص Bash.
- ↑ "الفصل 2. لغة أوامر الصدفة" ، المواصفات الأساسية لمجموعة Open Group (IEEE Std 1003.1-2017) (الإصدار 7 )، IEEE، 2018 [2008]،
إذا بدأ السطر الأول من ملف أوامر الصدفة بالحرفين "#!"، فإن النتائج غير محددة.
- ↑ Autoconf ، مؤسسة البرمجيات الحرة،
ماكرو: AC_SYS_INTERPRETER: تحقق مما إذا كان النظام يدعم بدء تشغيل البرامج النصية بسطر من الشكل '#!/bin/sh' لتحديد المفسر المراد استخدامه للبرنامج النصي.
- ↑ "ما قصة #!/usr/bin/env bash؟" . تم الاطلاع عليه بتاريخ 6 مارس 2024 .
- ↑ "execve(2) man page" .، قسم "نصوص المترجم"
- ↑ "سلوك /usr/bin/env" . Mail-index.netbsd.org. 9 نوفمبر 2008. تم الاطلاع عليه في 18 نوفمبر 2010 .
- ↑ – دليل الأوامر العامة لنظام FreeBSD
- ↑ "استدعاء البيئة" . GNU Coreutils . تم الاسترجاع في 11 فبراير 2020 .
- ↑ "الضغط على زر الرجوع يتسبب في فشل برنامج bash" . 8 نوفمبر 2013.
- ↑ "دليل GNU Autoconf الإصدار 2.57، الفصل 10: برمجة الصدفة المحمولة" . مؤرشف من الأصل بتاريخ 18 يناير 2008. تم الاطلاع عليه بتاريخ 14 مايو 2020 .
- ١ ٢ "أسئلة شائعة حول UTF-8 وUTF-16 وUTF-32 وBOM: هل يمكن أن يحتوي دفق بيانات UTF-8 على حرف BOM (بصيغة UTF-8)؟ إذا كانت الإجابة بنعم، فهل يمكنني افتراض أن بايتات UTF-8 المتبقية مرتبة بترتيب Big-Endian؟" . يونيكود . تم الاطلاع عليه بتاريخ ١٠ نوفمبر ٢٠٢٣ .
- ↑ "مدخل ملف المصطلحات لـ shebang" . Catb.org . تم الاطلاع عليه بتاريخ 16 يونيو 2010 .
- ↑ وول، لاري . "لم يفهم بيرل البرامج النصية ذات صلاحيات المستخدم الجذر التي تحتوي على مسافة في السطر الأول بين سطر shebang واسم المفسر" . يوزنت .
- ↑ مكوسيك، مارشال كيرك (أغسطس 1998)، "2.8/usr/kernel/sys/sys/sys1.c" ، أرشيف CSRG CD-ROM 1: أنظمة بيركلي 1978-1986 ، السطر 43، مؤرشف من الأصل في 8 يوليو 2017،
# define SCRMAG '#!' - ↑ نظام المشاركة الزمنية في يونكس: دليل مبرمج يونكس (PDF) ، المجلد 2A ( الطبعة السابعة)، يناير 1979، مؤرشف من النسخة الأصلية (PDF) في 5 يونيو 2001
- ↑ ماكوسيك، مارشال كيرك (أغسطس 1998)، "4.0/usr/src/sys/newsys/sys1.c" ، أرشيف CSRG، القرص المضغوط 1: أنظمة بيركلي 1978-1986 ، مؤرشف من الأصل في 8 يوليو 2017
- ↑ جيلز. "لينكس - لماذا يتم تعطيل SUID لبرامج shell النصية ولكن ليس للملفات الثنائية؟" . تبادل معلومات أمن المعلومات .
- ↑ ريتشي، دينيس. "دينيس ريتشي وهاش بانغ" . Talisman.org . تم الاطلاع عليه بتاريخ 3 ديسمبر 2020 .
- ↑ روبيني، أليساندرو (31 ديسمبر 1997). "اللعب بالصيغ الثنائية" . مجلة لينكس . تم الاطلاع عليه في 1 يناير 2015 .
روابط خارجية
- يونكس
