ما هو الفرق بين تشغيل سكربت bash باستخدام sh و. /

يمكن أن يظهر هذا السؤال نفسه عند استخدام أي نوع من البرامج النصية ، وليس فقط bash. هل هناك فرق كبير بين تشغيل نص من خلال المترجم وتشغيله مباشرة؟

هناك لغز آخر سنكشفه في هذا المنشور المثير للاهتمام من Let's Use Linux (uL).


عندما تقوم بتشغيل برنامج نصي عن طريق تمرير اسم ملف البرنامج النصي إلى مترجم (sh ، python ، perl ، إلخ) ، فأنت تقوم بالفعل بتنفيذ المترجم ، وتمرير البرنامج الذي تريد تنفيذه كوسيطة. على سبيل المثال ، نقوم بتشغيل مترجم sh عن طريق تمرير حجة miscript.sh.

sh myscript.sh

إذا قمت بتشغيل البرنامج النصي من تلقاء نفسه ، فسيقوم النظام باستدعاء المترجم الفوري الذي يحتاجه ، وبعد ذلك ، نعم ، سيقوم بتنفيذ البرنامج النصي الذي يمرره كوسيط للمترجم ، ولكن كل ذلك تلقائيًا وبدون معرفة المستخدم الذي نفذ البرنامج النصي.

./myscript.sh

لتشغيل البرنامج النصي بنفسه ، يجب استيفاء شرطين:

1) يجب أن يتضمن البرنامج النصي "خط الانفجار". هذا هو السطر الأول من البرنامج النصي ، والذي يجب أن يبدأ بالأحرف #! وأنه يجب عليك تحديد المسار حيث يوجد المترجم الفوري. من المهم ملاحظة أن هذا الشرط ينطبق على أي نوع من النصوص (بايثون ، بيرل ، إلخ) ، وليس فقط من باش.

وبالتالي ، على سبيل المثال ، يجب أن يحتوي البرنامج النصي الخاص بنا على ما يلي باعتباره السطر الأول:

#! / بن / باش

2) يجب أن يحتوي الملف على أذونات التنفيذ:

لمنح أذونات التنفيذ للبرنامج النصي ، يجب أن نكتب:

chmod a + x miscript.sh

جاهز ، الآن فقط قم بتشغيله على النحو التالي:

./myscript.sh

أو عن طريق نسخ البرنامج النصي إلى مسار "خاص" يسمح باستدعائه بسهولة. على سبيل المثال ، يمكننا نسخه إلى / usr / sbin وتشغيله من أي مكان دون تضمين المسار الكامل حيث يوجد:

ننسخ:

sudo cp miscript.sh / usr / sbin / miscript

ننفذ:

خطأ

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


اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   اوزوالدو فيلارويل قال

    أتفق معك في Erpower ، كل من إصدار المترجم الفوري ومساره متغيران وليسا ثابتان ، بل وأكثر من ذلك إذا اعتبر أن توزيعات GNU / Linux ليست الوحيدة التي تستخدم Bash (هناك أيضًا: freeBSD و OpenSolaris و Mac) والعديد من منها تكوينات أو مسارات مختلفة.

    الشيء المهم هو أن تعرف أن لديك المرونة (كما ذكرت جيدًا) للعب مع استدعاء البرنامج النصي ، إما باستخدام ./ أو مع sh (أو python ... إلخ)

  2.   he_who_knows@gmail.com قال

    Bash هو برنامج كمبيوتر وظيفته تفسير الطلبات.

    يعتمد على غلاف Unix ومتوافق مع POSIX.

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

  3.   ديانا سي قال

    مرحبًا ، أنا مبتدئ في استخدام البرامج النصية وأود أن أعرف ما إذا كان بإمكان أحدهم مساعدتي في حل مشكلة لدي:

    أنا أدير برنامجًا يتطلب إدراج العديد من البيانات الأولية من خلال وحدة التحكم واكتشفت أنه من خلال برنامج نصي ، يمكن تنفيذ البرنامج بالبيانات الأولية ، حتى لا تضطر إلى كتابته مرارًا وتكرارًا عندما أحتاج إلى تشغيل البرنامج.

    لا أعرف كيف أفعل ذلك ، لذا إذا استطاع أحد مساعدتي في ذلك ، سأكون ممتنًا جدًا.

  4.   لنستخدم لينكس قال

    انظر ، هذا يعتمد على لغة البرمجة التي تكتب النص بها. ومع ذلك ، ما تحتاجه على أي حال هو:

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

    2) في حالة تماثل القيم دائمًا ، يمكنك استخدام الثوابت.

    3) هناك خيار آخر وهو إمكانية أن يأخذ النص البرمجي معلمات.

    في صحتك! بول.

  5.   لنستخدم لينكس قال

    من المثير للاهتمام ما ذكرت. يطلق عليه من الشكلين: خط shebang أو خط الانفجار المباشر. أعطيك المعلومات: http://python.about.com/od/programmingglossary/g/defbangline.htm
    في صحتك! بول.

  6.   تضمين التغريدة قال

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

  7.   لنستخدم لينكس قال

    حسنا. سوف ابقى ذلك في الاعتبار.
    في صحتك! بول.

  8.   لنستخدم لينكس قال

    أنا سعيد لأنه نجح. أحاول دائمًا نشر الأشياء التي أعتقد أنها قد تكون ممتعة وعملية.
    عناق! بول.

  9.   فيليكس مانويل بريتو امارانتي قال

    يضيف كل مبرمج لديه عادات جيدة "خطًا قويًا" إلى السطر الأول من التعليمات البرمجية. في Python ، لا أنسى أبدًا الترميز وخط الانفجار.
    #! / usr / bin / python2.7
    # *. * الترميز = utf-8 *. *

  10.   ديكس 02 قال

    ممتاز ، آمل أن تتمكن من نشر المزيد من المعلومات حول سطر الأوامر ، خاصة عندما يتعلق الأمر بالتجميع أو التثبيت من ملفات المصدر (tar.gz ، إلخ.)

  11.   جو دي كاسترو قال

    لم أسمع قط عن "خط الانفجار" لطالما عرفته باسم شيبانغ

    http://en.wikipedia.org/wiki/Shebang_%28Unix%29

    تحياتي

  12.   جوناثان فرنانديز قال

    ملاحظة ممتعة ... شكرا لك!

  13.   eM Say eM قال

    كم هو مثير للاهتمام ، أعلن أنني جاهل تمامًا بالبرمجة وكل ما يتعلق بالبرنامج النصي ، لم يكن لدي أي فكرة عن كيفية عمله ، لكنني لاحظت أن البعض لديه هذا العنوان.

  14.   ماريو ريموندي قال

    توضيح حدث لي يتعلق بهذا الإدخال: أردت تثبيت أداة adobe air (حاسبة احتمالات لعبة البوكر). ما يفعله برنامج adobe air installer هو تشغيل البرنامج النصي المقابل باستخدام "su" ولكن في النموذج. / يطلب منك كلمة مرور الجذر. نظرًا لأن البرنامج النصي لم يكن لديه أذونات تنفيذ ، فقد رفض الإذن ، الحل: قم بتشغيل البرنامج النصي باستخدام sh إذا كنت لا تريد تغيير الأذونات (أسرع من الانتقال إلى مجلد tmp chmod وكل ذلك). هناك يتم تنفيذ البرنامج النصي ، وهو يستدعي مثبت adobe وشيء فراشة آخر.

  15.   إيرو سينين قال

    مقال ممتع جدا! شكرًا لمساعدتي في معرفة المزيد عن وحدة التحكم. دعنا نرى ما إذا كنت تستمر في نشر مقالات مثل هذه ^ ^.
    استمر في ذلك ، فهذه بلا شك مدونتي المفضلة !!

  16.   ارباور قال

    ضع في اعتبارك أنه قد تكون هناك اختلافات بين إصدارات المترجم الفوري المستخدمة. تشغيل البرنامج النصي مباشرة وفقًا لـ shebang لا توجد طريقة للإشارة إلى إصدار المترجم الفوري الذي يجب استخدامه ، والذي قد يكون ضروريًا. إذا قمت بتشغيل المترجم بدلاً من ذلك وقمت بتمرير البرنامج النصي كمعامل ، فأنت تعرف أي إصدار منه يعمل.

    على سبيل المثال في Python ، إذا كان shebang هو #! / Usr / bin / python2.4 ، فسيعمل البرنامج بشكل مختلف عما إذا كان #! / Usr / bin / python2.6 أو إذا كان #! / Usr / bin / python (والذي عادة ما يكون رابطًا رمزيًا لإصدار Python الذي تم تثبيته وتكوينه افتراضيًا). يحدث هذا لأن Python 2.6 لديها وظائف جديدة لم تكن موجودة في Python 2.4 ، لذا فإن كتابة نص برمجي يستخدم تلك الوظيفة يشير إلى #! / Usr / bin / python shebang ستفشل إذا كان النظام مثبتًا عليه python 2.4 فقط. بدلاً من ذلك ، يمكنك دائمًا إجبار البرنامج النصي على العمل بإصدار python الذي تريده عن طريق بدء تشغيله بـ "python2.4 /path/al/script.py" أو "python2.6 /path/al/script.py/

    بالنسبة لنصوص الصدفة ، توجد أيضًا اختلافات بين الأصداف التي تستخدمها ، لذا فإن استخدام #! / Bin / sh و #! / Bin / bash يمكن أن يكون له نتائج مختلفة اعتمادًا على البرنامج النصي. إذا كتبت نصًا باستخدام ميزات موجودة فقط في bash ولكنك حددت #! / Bin / sh shebang ، فمن المحتمل أن يعمل البرنامج النصي الخاص بك على Linux (في معظم التوزيعات / bin / sh هو رابط رمزي لـ bash) لكنه سيفشل على الأرجح في أنظمة UNIX الأخرى حيث لا يتم تثبيت bash أو حيث / bin / sh ليس ارتباطًا رمزيًا بـ / bin / bash.

    فيما يتعلق أيضًا بقابلية النقل ، يجب أن يؤخذ في الاعتبار أن المسار المشار إليه في shebang مطلق ، وهناك أوقات يتم فيها تثبيت المترجمين الفوريين في أماكن أخرى. على سبيل المثال ، من الشائع أن يكون مترجم بايثون مثبتًا في / usr / local / bin / python إذا قمت بتنزيل Python وترجمته بدلاً من استخدام حزمة من التوزيع الخاص بك. إذا كان shebang الخاص بك هو #! / Usr / bin / python ، فلن يعمل البرنامج النصي على تلك الأنظمة. لمحاولة تجنب هذه المشاكل ، يمكنك استخدام shebang "#! / Usr / bin / env python" (أو "#! / Usr / bin / env sh") كما هو موضح في http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability

  17.   لنستخدم لينكس قال

    شكرا جوناثان! من الجيد رؤيتك تعليق!
    في صحتك! بول.

  18.   أنطونيو قال

    لا يوجد في أي مكان ما أريد معرفته ، أو على الأقل لا أعرف كيفية رفعه في محرك البحث ، أريد إنشاء نص برمجي لسبب ما ، ينفذ xX الأمر aptitude أو "su" (إنه مثال فقط ولكن هما الحالتان اللتان يمكنني التفكير فيهما) وفي حالة aptitude أحيانًا يطلب مني إدخال "yon" أو في "su" يطلب مني كلمة المرور ... أود أن يقوم البرنامج النصي بتحديد هذه الخيارات تلقائيًا إما بتمرير معلمة أو باستخدام طريقة ما لا يعرفها .... شكرا على إنتباهك

    1.    دعنا نستخدم لينكس قال

      مرحبا أنطونيو! إذا كانت مشكلتك هي إدخال كلمة المرور ، فلا أعتقد أن هناك حلًا. على وجه التحديد لأنه إجراء أمني ، بحيث لا يمكن للجميع تثبيت برنامج.
      فيما يتعلق بالكفاءة والاضطرار إلى طرح نعم ، أعتقد أنه يمكن حلها. لا أتذكر في هذه المرحلة المعلمة الدقيقة التي يجب استخدامها ، ولكن اكتشفيها في صفحات الدليل. افتح Terminal وأدخل الأمر: man aptitude.
      عناق! بول.

  19.   ديفيد م قال

    منشور جيد جدا.
    أعجبني بشكل خاص - في هذا المنشور - أن السؤال / الشك الذي ينشأ يتم الرد عليه بوضوح شديد ودقة.