“She-bang” neden “#!” İle başlıyor?


10

Neden birlikte "diye-patlama" nerede başlar #!gibi #!/bin/bash? Her zaman böyle yapıldığını kabul ettim, ama arkasında bir neden var mı?

Neden başlayalım #; bu genellikle bir yorum değil mi? Yoksa yorum olması gereken nokta mı?


4
Wikipedia , (evet, hattın mevcut kabuklar tarafından göz ardı edilmesi gerektiğinin #!) açıklaması da dahil olmak üzere oldukça ayrıntılı bir geçmişe sahiptir (dmr hatırlar gibi… #).
Gilles 'SO- kötü olmayı kes

Vikipedi kontrol etmek için kaçırdı :)
Johan

1
Keşke kabuklar, eğer varsa, yabancı bir CR / LF'yi soymaya yetecek kadar zeki olsaydı ...;)
Aaron D.Marasco

Yanıtlar:


16

Tipik olarak, mesele , sadece karşılık gelir #!( !tipik olarak "patlama" olarak adlandırılır ve bu "kadın" ya da "keskin" ya da "hash" için bir bozulması gibi görünüyor #) - bütün çizgi bir adlandırılır mesele hat

Nasıl kullanılacağını bilmeyen şeylerle geriye dönük uyumluluk için kasıtlı olarak bir yorum karakteri ile başlar; !ile başlayan bir dosya yüzden sadece, dosyayı başlayan rastgele açıklama ayırmak için muhtemelen olduğunu # this is my script!çalıştırmayı deneyin this is my script!tercüman


2
Bang !genellikle yürütülecek komutu belirtmek için diğer bağlamlarda kullanılır. Örneğin vim, kendi komut satırlarına sahip diğer programlarda, bang genellikle komutu dahili arabirimleri yerine bir sistem kabuğunda çalıştırmasını sağlayan çıkış karakteridir.
Caleb

4

Bunu anlamak için betiğin ilk satırının 2 farklı program tarafından iki kez okunduğunu anlamalısınız . Çekirdek ilk kez dosyayı açar #!ve ilk satırda bu karakter dizisini ( ) arar . Bulursa, dosya adını parametre olarak ileterek burada belirtilen kabuk programını çalıştırır. (örneğin, dosya ile /home/me/foobaşlarsa #!/bin/sh, çekirdek çalışır /bin/sh /home/me/foo).

Ardından kabuk ( bin/shveya herhangi bir tercüman programı belirtilmişse) dosyayı okur. Kabuk, shebang hatları hakkında hiçbir şey bilmiyor ama yine de ilk satırı okuyacaktır çünkü dosyadaki herhangi bir satır gibi ... hepsini okur. Kabuğun davranışını herhangi bir şekilde çökmesini veya değiştirmesini istemezsiniz ... Bunu yapmanın yolu, yorum yapmak ve görmezden gelmektir. Bu nedenle, bir çekirdek komutunun başlaması için en iyi karakter yorum karakteri olacaktır.


Gerçekten bunu yapan çekirdek mi, işte çalıştığınız mermi kovanı ayrıştıracak ve sonra senaryoyu itecek gibi geliyor
Johan

Hayır ... çekirdeğin kendisi, canlı ve şahsen. Senaryoyu yürütmek için bir kabuk kullanmasanız bile çalışacaktır ... bir kabuğun yanı sıra bir dosya yürütmenin başka yolları da vardır ... örneğin "C" programından "exec" sistem çağrısını kullanarak
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" ascii'de bayt 0x23 0x21 - exec () bu baytları gördüğünde, davranış satırın geri kalanını bir tercümana giden yol olarak ele almaktır.
Aaron McMillin

1

Bunun bir yorum olması gerekir, çünkü yalnızca bu şekilde "yorum adı komut dosyası adı" gibi bir komut dosyası çalıştırmak için çalışır. "!" Nin kökenini bilmiyorum.


1
Sadece ./scriptname komutunu çalıştırsanız bile, tercüman hala patlama çizgisini görüyor, bu yüzden hala bir yorum olmalı.
psusi

1
Veya daha ayrıntılı olmak gerekirse: Mesele: '#!' yorumlayıcı tarafından görülmeyecek şekilde tasarlanmıştır - bu nedenle '#' yorum karakteriyle başlamalıdır. Bunun yerine, çekirdek 'exec [lv] *' sistem çağrıları dizisi tarafından 'görülür' (ve yorumlanır).
arielf
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.