Tercih edilen Bash shebang nedir?


1131

BashÇoğu kullanım için objektif olarak diğerlerinden daha iyi bir şey var mı ?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • vb

Uzun zaman önce, sonuna bir tire eklemenin birinin komut dosyasına bir komut iletmesini engellediğini ancak bununla ilgili herhangi bir ayrıntı bulamadığını duyduğumu belirsiz bir şekilde hatırlıyorum.


4
Ve /usr/local/bin/bashOpenBSD'de.
01

Yanıtlar:


1535

Sen kullanmalıdır #!/usr/bin/env bashiçin taşınabilirlik : koymak farklı * nixes bashfarklı yerlerde ve kullanan /usr/bin/envilk çalıştırmak için bir çözüm bashbulunabilir PATH. Ve shdeğilbash .


9
Teşekkürler. Ayrıca - $! / Usr / bin / env bash'ın sonuna ekleme yapmak gibi görünüyor - shebang'da * nix tarafından sadece bir argümana izin verildiğinden ve bu 'bash' tarafından kullanıldığından hiçbir şey yapmayacak. Görünüşe göre bu sadece komut dosyasının shebang hiçbir argümanı ( /bin/sh, vb) olmayan diğerlerinden biri ise, komut satırı üzerindeki komut dosyasına kötü niyetli argümanların geçmesini önlemek için yararlıdır .
Kürtoz

13
@Ray tüm sistemlerde bashbulunmaz /bin.
ptierno

12
Benim için aynı, sadece bir takma ada ekledim: alias shebang='echo "#!/usr/bin/env bash"'şimdi sadece terminali açmam ve buraya gitmek yerine shebang yazmam gerekiyor.
Oylex

19
Bu cevap aldatıcı. POSIX env, adresinde olduğunu söylemiyor /usr/bin/env. Yolda /bin/envolduğu sürece, aslında ya da herhangi bir yerde olabilir . Hiç de olabilir /dummy/enveğer /dummyiçindedir PATH. Shebang kendisi POSIX altında tanımsız, bu yüzden #!stop toasterUSB kahve makinesini başlatmak ve POSIX uyumlu olabilir. Bu yüzden #!/usr/bin/env bashözellikle daha iyi değil #!/bin/bash, bağlı olarak daha az taşınabilir olabilir.
darkfeline

19
@darkfeline Taşınabilirlik mutlak değildir - her platformda aynı şeyi yapacak herhangi bir script yapmak matematiksel olarak imkansızdır. 2012'den 2018'e kadar xor'dan /usr/bin/envdaha fazla makinede var , bu nedenle bu satırla başlayan bir komut dosyası beklenen şeyi mümkün olduğunca çok makinede yapacak. /bin/bash/usr/bin/bash
l0b0

80

/bin/shgenellikle sistemin varsayılan kabuğuna bir bağlantıdır, bashancak genellikle açıktır , örneğin Debian sistemleri daha hafiftir dash. Her iki durumda da, orijinal Bourne kabuğu sh, yani komut dosyanız bazı bash(2. nesil, "Bourne Again sh") belirli özellikler ( [[ ]]testler, diziler, çeşitli şekerli şeyler vb.) Kullanıyorsa, daha spesifik olmanız ve daha sonra kullanmanız gerekir. . Bu şekilde, bash'ın yüklü olmadığı sistemlerde komut dosyanız çalışmaz. Bu evrim hakkında heyecan verici bir film üçlemesi olabileceğini anlıyorum ...

Ayrıca olarak uyarılmış zaman unutmayın sh, bashbir dereceye kadar POSIX standardı gibi hareket eder sh (ayrıca bkz GNU docs bu konuda).


2
Public Domain Korn Shell (pdksh), OpenBSD'de varsayılan değerdir.
01

Çoğu sistem , init komut dosyalarının yüklenmeden önce çalışmasını oldukça zorlaştıracağı için /bin/shhiçbir yere bağlanmaz . /usr/usr
aij

Ben fötr kullanıcı, kulüpler - Ben koymak "çok ya da çoğu" Orada neden @aij Bilmiyorum /binve /sbinsadece, varsayılan olarak sembolik bağlar olmuştur yıllarca /usr/binve /usr/sbinböylece bu bağlamda, /bin/shbir bağlantıdır bashve gerçek dizin /usr/bin. Ama yukarıdakileri düzeltirim.
delicateLatticeworkFever

44

Şunu kullanmanızı öneririm:

#!/bin/bash

% 100 taşınabilir değildir (bazı sistemler farklı bashbir konuma yerleştirilir /bin), ancak mevcut komut dosyalarının çoğunun ana konuma en az bir bağlantı #!/bin/bashyapmak /bin/bashiçin çeşitli işletim sistemlerine baskı uyguladığı gerçeği .

Alternatifi:

#!/usr/bin/env bash

önerildi - ancak envkomutun içinde olduğuna dair bir garanti yok /usr/bin(ve olmadığı yerlerde sistemleri kullandım). Ayrıca, bu form bashgeçerli kullanıcılarda ilk örneğini kullanacaktır; bu $PATH, bash kabuğunun uygun bir sürümü olmayabilir.

(Ancak , içinde olduğu veya sistemin çalışmasını sağlamak için bir şeyler yaptığı için /usr/bin/envmakul derecede modern bir sistem üzerinde çalışmalıdır. Yukarıda bahsettiğim sistem, muhtemelen yaklaşık 25 yıldır kullanmadığım SunOS 4 idi.)env/usr/bin

Sahip olmayan bir sistemde çalıştırmak için bir komut dosyasına ihtiyacınız varsa /bin/bash, komut dosyasını, doğru konumu gösterecek şekilde değiştirebilirsiniz (kuşkusuz rahatsız edici).

Ben de daha derinlemesine tradeoffs ele aldık cevabım için bu soruya .

Bir biraz karanlık güncelleme: Bir sistem I kullanımı Termux , bir masaüstü Linux benzeri Android altında çalıştığında, yok katmanın /bin/bash( basholan /data/data/com.termux/files/usr/bin/bash) - ama desteğe özel işlem vardır #!/bin/bash.


3
2 yıl sonra ve bu hala en iyi tavsiye. Basit çözüm işe yaramazsa, önceki kararlarınızı sorgulamanız gerekir. Kabul edilen ve en çok oylanan cevap yanlış değil, sadece doğru değil :)
Yazılım Mühendisi

27

Uygun tercümanı çağırmak için bir mesele hattı kullanmak sadece BASH için değildir. Sisteminizde Perl, Python, PHP (CLI) ve diğer pek çok dil gibi yorumlanmış bir dil için bu boyutu kullanabilirsiniz. Bu arada, shebang

#!/bin/sh -

(ayrıca iki çizgi de olabilir, yani --) bash seçeneklerini sonlandırır. Sonrasında her şey dosya adı ve argüman olarak değerlendirilir.

envKomutu kullanmak komut dosyanızı taşınabilir kılar ve komut dosyanız için özel ortamlar kurmanıza olanak tanır, bu nedenle taşınabilir komut dosyalarının kullanması gerekir

#!/usr/bin/env bash

Ya da Perl gibi dil ne olursa olsun

#!/usr/bin/env perl

Şu mansayfalara baktığınızdan emin olun bash:

man bash

ve env:

man env

Not: Debian'da ve Ubuntu gibi Debian tabanlı sistemlere shbağlı dashdeğildir bash. Tüm sistem komut dosyalarının kullandığı gibi sh. Debian'a göre bu, bash'ın büyümesine ve sistemin sabit kalmasına izin veriyor.

Ayrıca, invocation * nix'i tutmak için, shebang tarafından çağrılan komut dosyalarında asla dosya uzantılarını kullanmıyorum, çünkü Windows'ta olduğu gibi yürütülebilir dosyalarda çağırma uzantısını atlayamazsınız. Dosya komutu bunu komut dosyası olarak tanımlayabilir.


4

Gerçekten bash betiklerinizi nasıl yazdığınıza bağlıdır. Senin Eğer /bin/shis bash sembolik olarak bash olarak çağrıldığında, sh, bazı özellikler kullanılamaz .

Bash'e özgü, POSIX olmayan özellikler istiyorsanız, #!/bin/bash


3
Bash, OpenBSD'ye yüklenmemiştir. Eğer yoluyla kurarsanız pkg_add, o zaman yolunda /usr/local/binolmayabilir, içinde bulunur.
01

bir POSIXözelliğe ne dersin ?
Nikolan Asad
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.