Bu yüzden, bunu iyi anladığımı sanıyordum, ama sadece bir test yaptım (birine karşı çıktığım bir sohbete yanıt olarak) ve anlayışımın hatalı olduğunu öğrendim ...
Kabuğumda bir dosyayı çalıştırdığımda tam olarak ne oluyor? Demek istediğim, eğer: kabuğuma ./somefile some arguments
yazıp geri dönüş tuşuna somefile
basarsam (ve cwd'de var ve okuma + yürütme izinlerini açtım somefile
), sonra başlık altında ne olur?
Cevap olduğunu düşündüm :
- Kabuk bir çağrı yapar
exec
ve yolu geçereksomefile
- Çekirdek , işlemcinin kaldırabileceği bir format olup olmadığını belirlemek için dosyanın sihirli sayısını inceler
somefile
ve bakar. - Sihirli sayı, dosyanın işlemcinin yürütebileceği bir formatta olduğunu gösterirse,
- yeni bir süreç yaratılır (süreç tablosuna bir giriş ile)
somefile
hafızaya okunur / haritalanır. Bir yığın oluşturuldu ve yürütme kod giriş noktası atlar olduğusomefile
ile,ARGV
parametreler bir dizi başlatılır: (achar**
,["some","arguments"]
)
- Sihirli sayı ise bir mesele daha sonra
exec()
yukarıdaki gibi yeni bir işlem olarak çoğaltılır, ancak yürütülebilir kullanılan shebang tarafından başvurulan yorumlayıcı (örneğin bir/bin/bash
ya da/bin/perl
) vesomefile
geçirilirSTDIN
- Dosyanın geçerli bir sihirli numarası yoksa, "geçersiz dosya (hatalı sihirli sayı): Yürütme biçimi hatası" gibi bir hata oluşur.
Ancak birileri bana dosya düz metin ise, kabuk komutları yürütmeye çalıştığını söyledi (yazmışım gibi bash somefile
). Buna inanmadım ama denedim ve doğruydu. Bu yüzden burada gerçekte ne olduğu hakkında bazı yanlış düşüncelerim var ve mekaniği anlamak istiyorum.
Kabuğumda bir dosya çalıştırdığımda tam olarak ne olur? (kadar ayrıntılı olarak makul ...)
source somefile
Ancak, yeni bir sürecin izinsiz olarak bırakılmasından çok farklı ./somefile
.
./somefile
, somefile
eğer dosyanın sihirli bir numarası yoksa, bash'ın komutları yerine getirmesine neden olacağını düşünmemiştim . Sadece bir hata göstereceğini düşündüm ve bunun yerine etkili bir şekilde görünüyorsource somefile
somefile
bir metin dosyası ise, çalıştırmayı denediğimde yeni bir kabuk üretildiğini onaylayabilirim . Bir dosyayı echo $$
vs kaynak yürütürsem, farklı davranır.