"Çağrıldı", Bash'i başlatan işlemin "sıfırıncı" komut satırı argümanına koyduğu her şeyi ifade eder argv[0].
Bir program exec*()syscalls ile başlatıldığında , programı içeren ikili dosyanın adını gerçekten bilmiyorlar, ancak bunun yerine çağrı işlemi oraya ne isterse koymakta özgürdür. Genellikle, elbette, isim dosya sisteminden alınır, bu yüzden çalıştırırsanız /bin/sh, oraya koyarsınız. Ve /bin/shBash ise , bir sembolik bağlantı olmak zorunda değildir, sert bir bağlantı veya kabuk programının başka bir kopyası olabilir.
"Program adı" ayarına bir örnek olarak, Bash'ın execkomutu -aseçenekle sıfırıncı argümanı ayarlayabilir . (Aynı şeyi Perl veya doğrudan C vb. İle de yapabiliriz.)
Burada, mynamesadece sıfırıncı argümanını bastıran basit bir C programı, gördüğü isim:
$ ./myname
I am ./myname
$ (exec -a something ./myname )
I am something
$ mv ./myname somename
$ ln -s somename othername
$ ./somename
I am ./somename
$ ./othername
I am ./othername
Kaynak:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Ancak, numaralı soruları cevaplamak için ...
Çalışan (1 & 4) sh somescriptne olursa olsun çalışır shsenin üzerindedir PATH, muhtemelen /bin/shama gibi muhtemelen bir şey/usr/xpg4/bin/sh .
- Bash ise, adı gördüğü için POSIX modunda çalışır
sh.
- Z kabuğu veya Korn kabuğu ise, aynı şekilde adı görür
sh, ancak Bourne kabuğu uyumlu olmayı amaçlayan ve bu kabukların her ikisinde de tam POSIX uyumluluk modundan farklı olan "SH uyumlu" modda çalışır. .
- Elbette Almquist kabuğu, gerçek bir Bourne kabuğu veya başka bir şey olabilir.
(2 ve 5) Koşu bash somescriptdüzenli Bash modunda çalışacaktır (yine, elbette bashsizin ne olduğuna bağlı PATH.)
(3) Burada, komut dosyasının adı doğrudan program dosyası yerine sistem çağrısına verilir. Çekirdek, hashbang satırını okur ve komut dosyasını çalıştırmak için kullanır.
(6) Bu karmaşık olanı. (3) 'e benzer, ancak ENOEXEC (Exec format error)hashbang hattı olmadığından programı başlatmak için sistem çağrısı başarısız olur ( ). Bundan sonra ne olacak çalıştırmakta olduğu kabuk olup olmadığı sarkar kendisini POSIX modunda. POSIX, POSIX uyumlu bir kabuğun yanıt olarak belirli bir şekilde davranmasını gerektirir ENOEXEC. Bununla birlikte, "bir merminin çağrılmasına eşdeğer bir komut" da bazı farklılıklar vardır, bu da farklı mermilerin farklı şeyler yaptığı anlamına gelir.
- Bourne Again kabuğu , komut dosyasının adıyla ilk komut satırı bağımsız değişkeni ile aynı modda yeniden çalışır . POSIX uyumlu modunda, elbette kendisini POSIX uyumlu modunda çalıştırır, böylece POSIX uyumlu bir kabuk çağırmak için POSIX gereksinimine uyar.
- Z kabuğu, Almquist kabuğu ve Korn kabuğu
/bin/sh, ilk komut satırı bağımsız değişkeni olarak diğer bağımsız değişkenlerin önüne eklenen komut dosyasının adıyla çalışır . Z kabuğu, Almquist kabuğu ve Korn kabuğu, /bin/shprogramın bir olduğunu varsayarak POSIX uyumlu bir kabuk çağırmaya çalışıyorlar .