"Dipanggil sebagai" mengacu pada apa pun itu bahwa proses mulai Bash menempatkan dalam argumen baris perintah "nol" argv[0],.
Ketika sebuah program dimulai dengan exec*()syscalls , mereka tidak benar-benar mengetahui nama file biner yang berisi program tersebut, tetapi sebaliknya proses panggilan bebas untuk meletakkan apa pun yang diinginkan di sana. Biasanya, tentu saja, nama tersebut diambil dari sistem file, jadi jika Anda menjalankannya /bin/sh, itulah yang akan dimasukkan ke sana. Dan jika /bin/shBash, itu tidak harus symlink, itu bisa berupa tautan keras atau hanya salinan lain dari program shell.
Sebagai contoh pengaturan "nama program", execperintah Bash dapat mengatur argumen nol dengan -aopsi. (Kita bisa melakukan hal yang sama dengan Perl, atau langsung dengan C, dll.)
Di sini, mynameadalah program C sederhana yang hanya mencetak argumen nolnya, nama yang dilihatnya sendiri:
$ ./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
Sumber:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("I am %s\n", argv[0]);
return 0;
}
Tapi, untuk menjawab pertanyaan bernomor ...
(1 & 4) menjalankan sh somescriptakan menjalankan apa pun yang shada di Anda PATH, mungkin /bin/shtetapi mungkin sesuatu seperti/usr/xpg4/bin/sh .
- Jika Bash, ini berjalan dalam mode POSIX, karena ia melihat namanya
sh.
- Jika itu adalah shell Z atau shell Korn, maka ia juga akan melihat namanya
sh, tetapi ia berjalan dalam mode "SH kompatibel", yang bertujuan untuk menjadi kompatibel dengan shell Bourne dan agak berbeda dengan mode konforman POSIX penuh di kedua shell tersebut. .
- Bisa jadi shell Almquist, shell Bourne yang sebenarnya, atau sesuatu yang lain, tentu saja.
(2 & 5) Menjalankan bash somescriptakan berjalan dalam mode Bash biasa (sekali lagi, tentu saja tergantung pada apa yang ada bashdi Anda PATH.)
(3) Di sini, nama skrip diberikan langsung ke pemanggilan sistem menggantikan file program. Kernel membaca baris hashbang dan menggunakannya untuk menjalankan skrip.
(6) Ini yang kompleks. Ini mirip dengan (3), tetapi panggilan sistem untuk memulai program gagal ( ENOEXEC (Exec format error)), karena tidak ada garis hashbang. Apa yang terjadi selanjutnya tergantung dari apakah shell yang Anda jalankan sendiri dalam mode POSIX. POSIX mensyaratkan bahwa shell yang sesuai dengan POSIX berperilaku dengan cara tertentu sebagai respons terhadap ENOEXEC. Namun, ada beberapa kelonggaran dalam "perintah yang setara dengan membuat shell dipanggil" yang berarti bahwa shell berbeda melakukan hal yang berbeda.
- Shell Bourne Again kembali menjalankan dirinya dalam mode yang sama dengan nama skrip sebagai argumen baris perintah pertama. Dalam mode POSIX-conformant-nya, ia tentu saja berjalan sendiri dalam mode POSIX-conformant-nya, sehingga mematuhi persyaratan POSIX untuk menjalankan shell yang sesuai dengan POSIX.
- Shell Z, shell Almquist, dan shell Korn dijalankan
/bin/shdengan nama skrip yang dimasukkan sebelum argumen lain sebagai argumen baris perintah pertama. Cangkang Z, cangkang Almquist, dan cangkang Korn sedang (mencoba) untuk memanggil cangkang yang sesuai dengan POSIX dengan tidak berasumsi bahwa /bin/shprogramnya adalah satu.