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

211

yazarsam,

#!/bin/bash
echo "foo"

veya

#!/bin/sh
echo "foo"

her ikisi de aynı sonucu verir. % Co_de% veya #!/bin/sh ile başlayan bazı komut dosyaları gördüm. Aralarında bir fark var mı?

    
sordu Rahul Virpara 25.05.2012 05:59

3 cevap

178

bash ve sh iki farklı kabuktur. Temel olarak bash , daha fazla özellik ve daha iyi bir sözdizimi ile sh . Çoğu komut aynı şekilde çalışır, ancak farklıdırlar.

Bunu söyledikten sonra, çoğu sistemde /bin/sh 'in sembolik bir bağlantı olacağını ve sh ' i çağırmayacağını anlamalısınız. Ubuntu /bin/sh 'si, bash ' ye, Linux dağıtımlarındaki tipik davranışa bağlanmak için kullanılır, ancak şimdi tire denen başka bir kabukla bağlantı kurmaya dönüşmüştür . % Co_de% kullanırım, çünkü bu oldukça fazla bir standarttır (ya da en azından benim deneyimimden en yaygın olanı). Aslında, bir betik betiği bash kullanacak olduğunda problemler ortaya çıkmaktadır, çünkü script-maker olması gerekmediğinde linkin #!/bin/sh olduğunu varsayar.

Daha fazla bilgi için İşte , İşte .

    
verilen cevap reverendj1 25.05.2012 06:08
62

Linux'ta ve diğer Unix benzeri sistemlerde birden fazla mermi seçeneğiniz vardır.

Kabuk, sadece küçük komut isteminizi yapmakla kalmaz, aynı zamanda komutlarınızı, özellikle de borular, şartlar ve benzerleri gibi karmaşık mantıklar koyarsanız yorumlamaktan sorumludur.

bash , Linux sistemlerinin kullanıcıları için varsayılan kabuk olarak kullanılan en yaygın kabuktur . Unix tarihi boyunca kullanılan diğer kabukların ruhani bir uzantısıdır. Onun adı bash , C Shell ve Korn Shell'den gelen özellikleri de içermekle birlikte, Bourne-shell'in yerine koyması için tasarlanan Bourne-Shell'in bir kısaltmasıdır.

Çalıştırıldı, bu günlerde, /bin/bash 'den - bash ile herhangi bir sistem buradan erişebilir.

Sadece kabukları kullanan kullanıcılar değil. Komut dosyaları ( kabuk komut dosyaları ) bunları yorumlamak için kabuklara ihtiyaç duyar. Bir kabuk komut dosyasını çalıştırdığınızda, sisteminizin komut dosyanızı yürütmek için bir kabuk işlemi başlatması gerekir.

Sorun, farklı kabukların aralarında küçük tutarsızlıklar olduğunu ve komut dosyalarını çalıştırmaya gelince, bunlar gerçek bir sorun olabilir. bash , yalnızca bash'a özgü olan ve diğer kabuklara özgü olmayan, oldukça fazla komut dosyası içeriğine sahiptir. Bu iyi, eğer bu betikleri çalıştırmak için her zaman bash kullanacaksanız. Diğer kabuklar ya bash öykünmeye çalışabilir ya da bash'ın oldukça iyi desteklediği POSIX standardına bağlı kalır (ancak kendi uzantılarını ekler).

Bir kabuk betiğinin tepesinde, bir shebang kullanılarak çalıştırılması gereken kabuğu belirtmek mümkündür. Bir betik ilk satırda #!/bin/bash belirtebilir, bu da betiğin her zaman başka bir kabuktan ziyade bash ile çalıştırılması anlamına gelir.

/ bin / sh , sistem kabuğunu temsil eden bir yürütülebilir dosyadır. Aslında, genellikle, sistem kabuğunun hangi kabuk olduğundan, yürütülebilir dosyayı gösteren 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 bir süredir bu genellikle bash sembolik bir bağlantıydı, öyle ki, her zaman / bin / sh ile bash veya bash uyumlu bir kabuğa bağlantı kuracaktı. . Ancak, son birkaç yılda Debian (ve Ubuntu) sistem kabuğunu bash'tan tire 'ye çevirmeye karar verdi. / bin / sh için bash kullanmanın Linux (iyi, GNU) uzun bir geleneği ile kabuk - kırma. Dash, daha hızlı ve daha hızlı bir kabuk olarak görülebilir ve bu da önyükleme hızına (ve paket yükleme komut dosyaları gibi çok sayıda kabuk betiği gerektiren diğer şeylere) faydalı olabilir.

Dash, aynı POSIX standardına dayanan bash ile oldukça uyumludur. Ancak, bash özel uzantıları uygulamıyor. Varolan, #!/bin/sh 'yi (sistem kabuğu) shebang olarak kullanan, ancak bash özel uzantıları gerektiren komut dosyaları vardır. Bu, şu anda Debian ve Ubuntu tarafından düzeltilmesi gereken bir hatası olarak kabul ediliyor. Bu da / bin / sh komutunu işaret ettiğinde çalışabiliyor.

Ubuntu’nun sistem kabuğu işaretli olmasına rağmen, giriş kabuğunuz kullanıcınız bu zamanda bash olmaya devam eder. Yani, Linux'un herhangi bir yerinde bir terminal emülatörüne girdiğinizde, giriş kabuğunuz bash olacaktır. Kabuk etkileşimli olarak kullanıldığında, işlem hızı o kadar da zor değildir ve kullanıcılar bash'ı (ve ev dizininde bash'a özgü özelleştirmeler olabilir) bilirler.

Komut yazarken neleri kullanmanız gerekir?

Eğer betiğiniz sadece bash tarafından desteklenen özellikler gerektiriyorsa, #!/bin/bash kullanın.

Ancak, eğer mümkün olursa, komut dosyanızın POSIX uyumlu olduğundan emin olmak iyi olacaktır ve her zaman, oldukça güvenilir bir şekilde, tercih edilen POSIX uyumlu sistem kabuğunu herhangi bir kurulumda işaret eden #!/bin/sh kullanın.

    
verilen cevap thomasrutter 25.05.2012 10:31
15

Önceki yanıtlara ek olarak, /bin/sh /bin/bash değerine sembolik bir bağlantı olsa bile, #!/bin/sh #!/bin/bash ile tamamen eşdeğer değildir.

bash (1) man page 'den:

  

"Eğer bash, sh ile çağrılırsa, başlatma işlemini taklit etmeye çalışır.   sh'in tarihsel versiyonlarının davranışları olabildiğince yakından   POSIX standardına da uygun. "

Örneğin, belirli bir belirli sözdizimi:

 exec  > >(tee logfile.txt)

,% sh_de% ile başlayan bir kabukta, sh-bash sembolik bağlantı yerinde olsa bile bir hata verir.

    
verilen cevap AnkiF 14.01.2015 12:24

Etiketlerdeki diğer soruları oku