eğer yazarsam
#!/bin/bash
echo "foo"
veya
#!/bin/sh
echo "foo"
her ikisi de aynı şekildedir. #!/bin/sh
Veya ile başlayan bazı scriptler gördüm #!/bin/bash
. Aralarında fark var mı?
eğer yazarsam
#!/bin/bash
echo "foo"
veya
#!/bin/sh
echo "foo"
her ikisi de aynı şekildedir. #!/bin/sh
Veya ile başlayan bazı scriptler gördüm #!/bin/bash
. Aralarında fark var mı?
Yanıtlar:
bash
ve sh
iki farklı mermi var. Temel bash
olarak 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/sh
bağ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 bash
olması gerekmediği zamana bağlıdır.
Daha fazla bilgi için, http://man.cx/sh , http://man.cx/bash .
/bin/sh
bir 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
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/bash
ilk 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/sh
her 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.
Önceki cevaplara ek olarak, olsa bile /bin/sh
sembolik bağlantıdır /bin/bash
, #!/bin/sh
tamamen 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/sh
sh-> bash sembolik bağlantısı yerinde olsa bile, bir kabukta hata verir .