#! / Bin / sh ve #! / Bin / bash arasındaki fark nedir?


280

eğer yazarsam

#!/bin/bash
echo "foo"

veya

#!/bin/sh
echo "foo"

her ikisi de aynı şekildedir. #!/bin/shVeya ile başlayan bazı scriptler gördüm #!/bin/bash. Aralarında fark var mı?

Yanıtlar:


242

bashve shiki farklı mermi var. Temel basholarak sh, daha fazla özellik ve daha iyi sözdizimi var. Çoğu komut aynı şekilde çalışır, ancak farklıdır.

Bunu söyledikten sonra /bin/sh, çoğu sistemde sembolik bir bağlantı olacağını ve çağrılmayacağını anlamalısınız sh. Ubuntu'da , Linux dağıtımlarındaki tipik davranışa /bin/shbağlanmak için kullanılır bash, ancak şimdi çizgi olarak adlandırılan başka bir kabuğa bağlantı vermek için değişti . Kullanacağım bash, bu neredeyse standart (ya da en azından benim deneyimlerime göre en yaygın olanı). Aslında, bir bash betiği kullanılacağı zaman problemler ortaya çıkar, #!/bin/shçünkü script-maker linkin basholması gerekmediği zamana bağlıdır.

Daha fazla bilgi için, http://man.cx/sh , http://man.cx/bash .


24
İlk paragrafınız oldukça yanıltıcıdır. "sh" hiç bir kabuk değildir, fakat Linux sistemlerinde genellikle bash veya dash olan ( şu anda kullanılan Ubuntu'nun son sürümleri) ya şu anda yapılandırılmış sistem kabuğuna bir bağlantıdır .
thomasrutter

18
/bin/shbir kabuk adı verilen eskiden Bourne kabuk geri 1977 Bash bir / bin / sh uyumlu kabuk olabilir POSIX yere uyum bir Bourne kabuk değiştirme olarak kullanılabilir. en.wikipedia.org/wiki/Bourne_shell
Alex

5
bash fiili bir standarttır (çok yaygın şekilde kullanılır), ancak "standart" değildir; Ubuntu'daki sh , Posix uyumlu bir kabuk olan çizgi kullanır , bu yüzden gerçekten standarttır. Benim tavsiyem , özellikle sunucu tarafı komut dosyaları için, komut dosyası oluşturma için kısa çizgi kullanmaktır . Bash daha etkileyici olmasına rağmen , çizgi oldukça hızlı çalışır ve daha güvenlidir.
Rick-777

@ Rick-777 Öyleyse açıkça #! / Bin / dash komut dosyalarımın üstüne koymalı mıyım? Ayrıca sadece komutları yazdığım ve ./scriptName ile çalıştığım komut dosyaları yazdım ve bu iyi çalıştı. #! / Bin / yourShellHere gerekli mi?
user137717,

@ Rick-777 Herhangi bir #! / Bin / shellName öğesini dışladığım durumlarda, fileName.sh dosyalarını adlandırdım. Bu, #! / Bin / sh öğesini bildirmeden tercih edilen sistem kabuğuna dolaylı olarak bağlanır mı?
user137717,

82

Linux ve diğer Unix benzeri sistemlerde birden fazla kabuk seçeneğine sahipsiniz.

Kabuk sadece küçük istemi çizmekten değil, özellikle borular, şartlar vb. Gibi karmaşık bir mantık koyarsanız komutlarınızı yorumlamaktan sorumludur.

bash , Linux sistemlerinin kullanıcıları için varsayılan bir kabuk olarak kullanılan en yaygın kabuktur. Unix tarihi boyunca kullanılan diğer mermilerin manevi bir soyudur. Adı, bash , Bourne kabuğuna bir saygı kaynağı olan Bourne-Again Shell'in kısaltmasıdır, ancak C Kabuğu ve Korn Kabuğu'nun özelliklerini de içerir.

Bugünlerde çalıştırıldı, şu andan itibaren /bin/bash- bash'li herhangi bir sistem buradan erişilebilir olacak.

Yine de sadece kabuk kullanan kullanıcılar değil. Scriptlerin ( shell scriptleri ) yorumlanması için kabuklara ihtiyaçları vardır. Bir kabuk betiği çalıştırdığınızda, sisteminizin betiğinizi yürütmek için bir kabuk işlemi başlatması gerekir.

Sorun, farklı kabukların aralarında küçük küçük tutarsızlıklar olması ve senaryoların çalıştırılması söz konusu olduğunda bunlar gerçek bir problem olabilir. bash , diğer kabuklara değil, yalnızca bash'a özgü olan birçok komut dosyası özelliğine sahiptir. Bu iyidir, her zaman bu komut dosyalarını çalıştırmak için bash kullanacaksanız. Diğer mermiler bash'ı taklit etmeye çalışabilir veya bash'ın oldukça iyi desteklediği POSIX standardına bağlı kalabilir (ancak kendi uzantılarını ekler).

Bir kabuk betiğinin en üstünde, bir shebang kullanarak çalıştırılması gereken bir kabuk belirtmek mümkündür. Bir komut dosyası #!/bin/bashilk satırda belirtilebilir, bu komut dosyasının başka bir kabuk yerine her zaman bash ile çalıştırılması gerektiği anlamına gelir.

/ bin / sh , sistem kabuğunu temsil eden yürütülebilir bir dosyadır . Aslında, genellikle sistem kabuğu olan kabuk için çalıştırılabilir maddeyi işaret eden sembolik bir bağlantı olarak uygulanır. Sistem kabuğu, sistem komut dosyalarının kullanması gereken varsayılan kabuk türüdür. Linux dağıtımlarında, uzun süredir bu genellikle bash ile sembolik bir bağdı , öyle ki, bu, / bin / sh'yi her zaman bash veya bash uyumlu bir kabukla birleştirmek bir gelenek haline geldi. Ancak, son birkaç yıl içinde Debian (ve Ubuntu) için bash sistem kabuğunu geçmek için karar çizgi- Benzer bir kabuk - Linux'ta (iyi, GNU) uzun bir geleneği / bash / sh için bash kullanma. Dash, önyükleme hızına yararlı olabilecek daha hafif ve daha hızlı bir kabuk olarak görülür (ve paket yükleme komut dosyaları gibi birçok kabuk komut dosyası gerektiren diğer şeyler).

Dash, aynı POSIX standardını temel alan bash ile oldukça uyumludur. Ancak, bash'a özgü uzantıları uygulamaz. Varlığını #!/bin/sh(sistem kabuğu) kendi shebang olarak kullanan, ancak bash özgü uzantıları gerektiren komut dosyaları vardır . Bu, şu anda çizgi çizildiğinde çalışabilmesi için / bin / sh gerektiren Debian ve Ubuntu tarafından düzeltilmesi gereken bir hata olarak kabul edilmektedir .

Ubuntu'nun sistem kabuğuna işaret ediyor olsa da , bir kullanıcı olarak giriş kabuğunuz şu anda bash olmaya devam ediyor. Yani, Linux'un herhangi bir yerindeki bir terminal emülatörüne giriş yaptığınızda, giriş kabuğunuz bash olacaktır. İşlem hızı, kabuk etkileşimli olarak kullanıldığında ve kullanıcılar bash ile ilgili bilgi sahibi olduklarında çok fazla bir sorun değildir (ve ana dizinlerinde bash'a özgü özelleştirmeler olabilir).

Komut dosyası yazarken kullanmanız gerekenler

Komut dosyanız yalnızca bash tarafından desteklenen özellikler gerektiriyorsa, kullanın #!/bin/bash.

Ancak, eğer mümkünse, betiğinizin POSIX uyumlu olduğundan emin olmak ve #!/bin/shher zaman, oldukça güvenilir bir şekilde, herhangi bir kurulumda tercih edilen POSIX uyumlu sistem kabuğunu göstermesi gereken kullanımı iyi olacaktır.


18

Önceki cevaplara ek olarak, olsa bile /bin/shsembolik bağlantıdır /bin/bash, #!/bin/shtamamen eşdeğer değildir #!/bin/bash.

Gönderen bash (1) man sayfasına :

"Sh adıyla bash çağrılırsa, sh'ın tarihsel sürümlerinin başlangıç ​​davranışını mümkün olduğunca yakından taklit etmeye çalışır ve POSIX standardına da uyar."

Örneğin, belirli bash sözdizimi:

 exec  > >(tee logfile.txt)

#!/bin/shsh-> bash sembolik bağlantısı yerinde olsa bile, bir kabukta hata verir .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.