سؤال ما الفرق بين #! / bin / sh و #! / bin / bash؟


إذا كتبت ،

#!/bin/bash
echo "foo"

أو

#!/bin/sh
echo "foo"

كلا غلة نفس. لقد رأيت بعض النصوص تبدأ بها #!/bin/sh أو #!/bin/bash. هل هناك أي اختلاف بينهما؟


211
2018-05-25 03:59


الأصل




الأجوبة:


bash و sh هما قذائف مختلفة. في الأساس bash هو sh، مع المزيد من الميزات وأفضل بناء الجملة. تعمل معظم الأوامر بنفس الطريقة ، لكنها مختلفة.

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

لمزيد من المعلومات، http://man.cx/sh، http://man.cx/bash.


178
2018-05-25 04:08



فقرتك الأولى مضللة تمامًا. "sh" ليس shell على الإطلاق ، ولكنه رابط إلى التهيئة الحالية قذيفة النظاموالتي عادة ما تكون في أنظمة Linux إما bash أو dash (الإصدارات الحديثة من Ubuntu تستخدم الأخير). - thomasrutter
/bin/sh اعتادت أن تكون قذيفة تسمى قذيفة بورني العودة في عام 1977. باش هو قذيفة متوافقة / بن / ش ذلك يستطيع أن تستخدم كبديل قذيفة bourne الذي هو posix المطابقة. en.wikipedia.org/wiki/Bourne_shell - Alex
سحق هو المعيار الواقعي (واسع الاستخدام) ولكنه ليس "قياسي" ؛ ش على استخدامات أوبونتو اندفاع، وهي عبارة عن غلاف متوافق مع Posix ، لذا فهو قياسي حقًا. نصيحتي هي استخدام اندفاع كلما كان ذلك ممكنًا للبرمجة النصية ، خاصة للبرامج النصية من جانب الخادم. برغم من سحقهو أكثر تعبيرا ، اندفاع يمتد بسرعة أكبر بكثير وأكثر أمانًا. - Rick-777
@ Rick-777 لذلك يجب أن أضع صراحة #! / بن / داش في الجزء العلوي من النصوص الخاصة بي؟ لقد كتبت أيضا مخطوطات حيث أكتب الأوامر فقط وتنفيذ مع ./scriptName والتي عملت بشكل جيد. هو #! / بن / yourShellHere ضرورية؟ - user137717
@ Rick-777 في الحالات التي أستبعد فيها أي #! / bin / shellName ، قمت بتسمية الملفات fileName.sh. هل يرتبط ذلك ضمنيًا بقذيفة النظام المفضلة بدون تصريح #! / bin / sh؟ - user137717


على نظام لينكس وغيره من الأنظمة المشابهة لنظام يونكس ، يمكنك الاختيار من بين عدة قذائف.

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

سحق هو الغلاف الأكثر شيوعًا المستخدم كقذيفة افتراضية لمستخدمي أنظمة Linux. وهو من نسل روحي من قذائف أخرى تستخدم في تاريخ يونيكس. اسمه، سحق هي اختصار لـ Bourne-Again Shell ، تحية لقذيفة Bourne التي تم تصميمها ليحل محلها ، على الرغم من أنها تتضمن أيضًا ميزات من C Shell و Korn Shell.

يتم تشغيله ، في هذه الأيام ، من /bin/bash - أي نظام مع باش سيكون عليه الوصول إليه هنا.

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

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

من الممكن تحديد في الجزء العلوي من برنامج نصي shell الذي يجب تشغيله باستخدام shell. قد يحدد البرنامج النصي #!/bin/bash في السطر الأول ، وهذا يعني أنه يجب تشغيل البرنامج النصي دائمًا باستخدام bash ، بدلاً من shell آخر.

/ بن / ش هو برنامج قابل للتنفيذ يمثل قذيفة النظام. في الواقع ، عادة ما يتم تنفيذه كحل ارتباط رمزي يشير إلى الملف التنفيذي لأي غلاف هو غلاف النظام. shell النظام هو نوع من shell الافتراضي الذي يجب أن تستخدمه البرامج النصية للنظام. في توزيعات لينكس ، كان هذا لفترة طويلة رابطًا رمزيًا سحق، لدرجة أنه أصبح إلى حد ما من اتفاقية لربط / بن / ش دائما لباش أو قذيفة متوافقة bash. ومع ذلك ، في العامين الماضيين قرر ديبيان (وأوبونتو) تبديل نظام قذيفة من باش ل اندفاع - قذيفة مماثلة - مع تقليد طويل في لينكس (حسنا ، جنو) باستخدام باش ل / بن / ش. يُنظر إلى Dash على أنه غلاف أخف وأسرع كثيرًا يمكن أن يكون مفيدًا لسرعة التمهيد (والأشياء الأخرى التي تتطلب الكثير من نصوص القوالب ، مثل البرامج النصية لتثبيت الحزم).

تتوافق أداة Dash جيدًا إلى حد كبير مع bash ، استنادًا إلى معيار POSIX نفسه. ومع ذلك ، فهي لا تنفذ الإضافات الخاصة بكلمة bash. هناك مخطوطات في الوجود التي تستخدم #!/bin/sh (shell النظام) مثل shebang ، ولكنها تتطلب ملحقات خاصة لـ bash. هذا يعتبر حاليا علة التي ينبغي أن تكون ثابتة بواسطة Debian و Ubuntu ، الذين يحتاجون إلى / bin / sh ليتمكنوا من العمل عند الإشارة إلى الشرطة.

على الرغم من أن Ubuntu قذيفة النظام يشير إلى اندفاعة ، الخاص بك قذيفة تسجيل الدخول كما يستمر المستخدم في bash في هذا الوقت. أي عندما تقوم بتسجيل الدخول إلى محاكي طرفي في أي مكان في نظام التشغيل Linux ، ستكون قذيفة تسجيل الدخول الخاصة بك bash. لا تعد سرعة التشغيل مشكلة عندما يتم استخدام shell بشكل تفاعلي ، ويكون المستخدمون على دراية بالباش (وقد يكون لديهم تخصيصات خاصة في bash في دليلهم الرئيسي).

ما يجب عليك استخدامه عند كتابة النصوص

إذا كان البرنامج النصي يتطلب ميزات لا تدعمها سوى bash ، فاستخدمها #!/bin/bash.

ولكن إذا كان ذلك ممكنًا ، سيكون من الجيد التأكد من أن النص البرمجي متوافق مع POSIX ، واستخدامه #!/bin/sh، والتي ينبغي دائما ، بشكل موثوق به ، تشير إلى shell النظام POSIX المتوافق المفضل في أي عملية تثبيت.


62
2018-05-25 08:31





بالإضافة إلى الإجابات السابقة ، حتى لو /bin/sh هو ارتباط رمزي ل /bin/bash، #!/bin/sh ليس معادلا تماما ل #!/bin/bash.

من باش (1) صفحة رجل :

"إذا تم استدعاء" bash "باسم" sh "، فإنه يحاول محاكاة بدء التشغيل   السلوك من الإصدارات التاريخية من ش أقرب ما يمكن ، في حين   المطابقة لمعايير POSIX أيضًا. "

على سبيل المثال ، بناء جملة bash المحدد:

 exec  > >(tee logfile.txt)

يعطي خطأ في قذيفة تبدأ مع #!/bin/sh، حتى مع الرابط الرمزي sh-> باش في المكان.


15
2018-01-14 11:24