kabuk komut dosyaları #! (sha-bang satırı) olmadan hala çalışıyor


10

Kabuk komut dosyalarına yeniyim ve yorumlayıcıyı çağırmak için komut dosyasının başlangıcında #! (Sha-bang) satırını kullanan birçok kitap yazdı. Ve bu komut dosyası için yeni bir kabuk çağıracak ve satır satır yorum yapacak. benim temel komut dosyası sihirli çizgi olmadan hala çalışıyor.

bu yüzden sorularım:

  • temel senaryomu tercümanı nereden aldı?
  • senaryo tercümanı nasıl bulmayı başardı.

Şimdi temel komut dosyamdan bahsetmeme izin verin, sadece aşağıdaki satırı içeriyor:

echo "sihirli çizgiler olmadan temel script"


Yanıtlar:


3

Sihirli çizgi sağlanmazsa, komut dosyasını çalıştırmak için varsayılan bir kabuk kullanılır. Bu varsayılan kabuk, bazı tatlarda olduğu gibi Bourne kabuğu (sh) olabilir, ancak diğer bazı tatlarda, kullanılan varsayılan kabuk, onu çalıştırmak için giriş kabuğu ile aynıdır. Mesele şu: Kabuğa karar vermek için sisteme bırakmayın, her zaman ilk satırda istediğiniz kabuğu sağlayın.


1
yup .. belki benim mevcut kabuk sihirli sayıları olmayan kabuk komut dosyası için varsayılan bir kabuk çağırıyor olabilir.
user1678213

1
@ user1678213 Evet, bunu yapan kabuğunuz (ve çekirdeğiniz değil).
Gilles 'SO- kötü olmayı bırak

1
POSIX'in bu durumda / bin / sh kullanılmasını zorunlu kıldığını düşünüyorum.
vonbrand

2
@vonbrand Bu yaygın bir yanlış anlamadır. POSIX /bin/sh, yalnızca shuygun bir PATH'ı keşfederken bulunan ilk yürütülebilir dosya olmak için POSIX kabuğunu zorunlu kılmaz .
jlliagre

3
Bu yanlış, asla yürütmek için kullanılan "giriş kabuğu" değildir. Ancak ne olabilir ki çağıran kabuk (komut dosyası bir kabuktan çağrılırsa) kendisini yorumlayan bir çocuğa sahip olabilir.
Stéphane Chazelas

8

Bir programı yürüttüğünüzde, çekirdek programın sihirli bir bayt dizisiyle başlayıp başlamadığını kontrol eder . Yürütülebilir dosya ile başlarsa #!, çekirdek satırın geri kalanını yorumlayıcı adı olarak yorumlar. Yürütülebilir dosya ile başlarsa \177ELF(burada \177bayt 127'dir), dosyayı ELF yürütülebilir dosyası olarak yükler ; günümüzde çoğu unix sisteminde normal olan budur.

Çekirdek dosya biçimini tanımıyorsa, dosyayı yürütmeyi reddeder ve ENOEXEC (Exec biçim hatası) hatasını döndürür. Kabuk bunu fark ettiğinde, programı bir kabuk betiği olarak yürütmek kendi kendini alır.

Buna çalışırken tanık olmak için, komut dosyanıza birkaç komut ekleyin:

ps l $$
ls -l /proc/$$/exe
echo hello

(Bu Linux içindir, diğer birleştirmeler için ayarlayın.) Sonra bu komut dosyasını çeşitli kabuklardan çalıştırmayı deneyin. Bazı kabukların komut dosyasını (bash, ksh93) yürütmek için yeni bir örnek oluşturduğunu, bazılarının da ortaya çıktığını /bin/sh(çizgi, pdksh, zsh) göreceksiniz.


ls -lKomutunuzla ne ararım? Bu: lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash-? Eğer öyleyse, ne diyor? Ayrıca, SHELL=/bin/bashüzerinde olduğumu fark ettim env, ancak bunu değiştirmek davranışları değiştirmedi. Belki ilgisiz?
Emanuel Berg

Eğer kabuk değişkeni "SHELL" değişiyor gibi görünüyor. evet, o zaman sadece kabuk değişkeni SHELL değerini chnging.it kabuk chnge.
user1678213

2
@EmanuelBerg Evet ( ls -l /proc/$$/exeaslında yazmalıydım ). exeKomut dosyanızın oluyor kabuğuna bağlantılar puan. Komut dosyanızı çalıştırdığınızda, komut dosyasını yorumlayan bash olduğunu görürsünüz. Örneğin pdksh'den çalıştırırsanız çalışır /bin/sh. Bu durumda SHELLortam değişkenini veya oturum açma kabuğunu kullanan herhangi bir kabuk bilmiyorum .
Gilles 'SO- kötü olmayı bırak

2
@ user1678213 Kabukların değiştirilmesi, /etc/passwdSSH üzerinden veya bir metin konsolunda oturum açtığınızda hangi kabuğun yürütüleceğini değiştirir. Hangi kabuğun komut dosyalarını çalıştırabileceğini değiştirmez.
Gilles 'SO- kötü olmayı bırak'

2
@ user1678213 Burada yazdıklarımı testler yaparak doğruladım. Test ettiğim mermilerin hiçbiri /etc/passwdhangi kabuğun kullanılacağına karar vermek için bakmadılar, ya kendilerinin bir örneğini çatalladılar ya da idam ettiler /bin/sh.
Gilles 'SO- kötü olmayı kes

-2

Muhtemelen aşağıdaki 3 olasılıktan biridir:

  1. Senaryoyu doğrudan tercüman, IE: bash script.sh ile çağırıyorsunuz

  2. Komut dosyası dosyasının adı, sistemin bu tür dosya için varsayılan programı aramasını sağlayan bir .sh uzantısına sahiptir.

  3. Yalnızca komut dosyasının çalıştırılabilir olduğunu tahmin edebildiğim için kullandığınız kabuk ortamı 'echo'yu tek başına yürütüyor. Örneğin, bir bash kabuğu kullanacak ve dosyanızda yalnızca ksh tarafından kullanılan bir komut varsa, o zaman işe yaramayacağını göreceksiniz.

İyi şanslar!


3
ne bash ne de herhangi bir uzantısı ile çağırdım.
user1678213

1
ve kabuk ortamı çalıştırmıyor çünkü komutumu çağırdıktan sonra ps komutunu çağırdığımda. ps komutu iki bash işlemini gösterir. iki bash çalışıyor demektir. biri benim giriş bash kabuk ve diğeri benim basic_script için bash
user1678213

1
2: çekirdek böyle bir şey yapmayacak. Zsh bunu yapabilir ve bash bunu yapmak için bükülebilir. 3: Evet, ama kabuklar arasında biraz değişiyor, cevabımı görün.
Gilles 'SO- kötü olmayı bırak
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.