UNIX kabuk komut dosyasında “#! / Bin / sh” satırı ne anlama geliyor?


142

Bazı kabuk komut dosyası eğitimlerini geçiyordum ve aşağıdaki örnek programı buldum:

#!/bin/sh
clear
echo "HELLO WORLD"

Birisi bana #!/bin/shbaşlangıçtaki yorumun öneminin ne olduğunu söyleyebilir mi?



2
Askubuntu hakkında iyi açıklama: askubuntu.com/questions/141928/…
fkoessler


Yanıtlar:


143

Buna bir shebang denir ve ana kabuğa betiği yürütmek için hangi tercümanın kullanılması gerektiğini söyler.

Örneğin

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Bu satırda gelen hiçbir şeyin belirtilen yorumlayıcıyla "ilgili" olmaması için bir yorum olarak uygulanır. örneğin, tüm komut dosyası dilleri, ile başlayan bir satırın #bir yorum olduğunu anlama eğilimindedir ve bu !/usr/bin/whateverbölümü, söz konusu dilde sözdizimi hatası olabilecek kısmı yoksayar .


6
Bunu işleyen kabuk genellikle çekirdek değil. Kabuk exec(), dosyadaki sistem çağrısını çağırır.
tripleee

47

Unix'te (yürütülebilir bit ayarlı bir program) bir program yürütmeye çalıştığınızda, işletim sistemi dosyanın ilk birkaç baytına bakar. Bunlar, programın formatına ve programın nasıl yürütüleceğine karar vermek için kullanılabilen "sihirli sayı" yı oluşturur.

#!sihirli sayı 0x2321'e karşılık gelir (bir ascii tablosuna bakın). Sistem sihirli sayıyı gördüğünde, bir metin komut dosyası ile uğraştığını bilir ve bir sonrakine kadar okur \n(bir sınır var, ama atm'den kaçıyor). Tercümanı (sapmadan sonraki ilk argüman) belirledikten sonra tercümanı çağırır.

Diğer dosyalar da sihirli numaralara sahiptir. Bir bitmap (.BMP) dosyasına üzerinden bakmayı deneyin lessve ilk iki karakterin olduğunu göreceksiniz BM. Bu sihirli sayı, dosyanın gerçekten bir bitmap olduğunu gösterir.


10

Bu komut dosyasının içinde bulunduğu dosya yürütülebilir durumdaysa, hash-bang ( #!), işletim sistemine komut dosyasını çalıştırmak için hangi yorumlayıcıyı kullanacağını bildirir. Bu durumda /bin/sh, örneğin.

Daha fazla bilgi için bir Wikipedia makalesi var.


5

İlk satır, kabuğa komut dosyasını doğrudan yürütürseniz (./run.sh; / bin / sh run.sh yerine), yorumlamak için bu programı (/ bin / sh) kullanması gerektiğini belirtir.

Bunu, genellikle -e (hatada çıkış) gibi bağımsız değişkenler iletmek veya diğer programları (/ bin / awk, / usr / bin / perl, vb.) Kullanmak için de kullanabilirsiniz.


-4

#!/bin/shveya #!/bin/bashkomut dosyasının ilk satırı olmalıdır, çünkü ilk satırda kullanmazsanız, sistem bu komut dosyasındaki tüm komutları farklı komutlar olarak görür. İlk satır ise, #!/bin/shtüm komutları tek bir komut dosyası olarak kabul eder ve bu dosyanın dosya psiçindeki komutları değil komutta çalıştığını gösterir .

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

1
Yığın Taşması Twitter değil. Lütfen gerçekten "u" ve "1." gibi kelimeleri heceleyerek zaman ayırın. Uygun bir dilbilgisi ve yazım önemli olduğundan bir referans kitap yazmaya yardımcı oluyorsunuz. Ayrıca, uygun biçimlendirmeye dikkat edin. Komut satırından verilecek komutlar, örneğinps ve gibi kod alıntıları #!/bin/shbiçimlendirilmelidir.
Tin Man

Burada İngilizceyi temizlemeye çalıştım ama bunun ne anlama geldiğinden hala emin değilim. Cevap, komut dosyasındaki komutların ayrı komutlar olarak yürütüleceğini söylemeye çalışır ve bir shebang ekleyerek komut dosyasını bir işlem listesinde tek bir komut olarak gösterecektir. Bu aslında doğru değil.
tripleee
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.