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 argumentsyazıp geri dönüş tuşuna somefilebasarsam (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
execve yolu geçereksomefile - Çekirdek , işlemcinin kaldırabileceği bir format olup olmadığını belirlemek için dosyanın sihirli sayısını inceler
somefileve 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)
somefilehafızaya okunur / haritalanır. Bir yığın oluşturuldu ve yürütme kod giriş noktası atlar olduğusomefileile,ARGVparametreler 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/bashya da/bin/perl) vesomefilegeç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 somefileAncak, yeni bir sürecin izinsiz olarak bırakılmasından çok farklı ./somefile.
./somefile, somefileeğ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
somefilebir 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.