Jadi, saya pikir saya memiliki pemahaman yang baik tentang ini, tetapi hanya menjalankan tes (dalam menanggapi percakapan di mana saya tidak setuju dengan seseorang) dan menemukan bahwa pemahaman saya cacat ...
Sedetail mungkin apa yang sebenarnya terjadi ketika saya menjalankan file di shell saya? Apa yang saya maksud adalah, jika saya mengetik: ./somefile some argumentske dalam shell saya dan tekan kembali (dan somefileada di cwd, dan saya telah membaca + mengeksekusi izin pada somefile) lalu apa yang terjadi di bawah tenda?
Saya pikir jawabannya adalah:
- Shell melakukan syscall to
exec, melewati path tosomefile - Kernel memeriksa
somefiledan melihat nomor ajaib file untuk menentukan apakah itu adalah format yang dapat ditangani prosesor - Jika angka ajaib menunjukkan bahwa file tersebut dalam format yang dapat dijalankan prosesor, maka
- proses baru dibuat (dengan entri dalam tabel proses)
somefiledibaca / dipetakan ke memori. Tumpukan dibuat dan eksekusi melompat ke titik masuk kodesomefile, denganARGVdiinisialisasi ke array parameter (achar**,["some","arguments"])
- Jika angka ajaib adalah shebang maka
exec()memunculkan proses baru seperti di atas, tetapi executable yang digunakan adalah interpreter yang dirujuk oleh shebang (misalnya/bin/bashatau/bin/perl) dansomefilediteruskan keSTDIN - Jika file tidak memiliki angka ajaib yang valid, maka kesalahan seperti "file tidak valid (angka sihir buruk): Kesalahan format Exec" terjadi
Namun seseorang mengatakan kepada saya bahwa jika file tersebut adalah teks biasa, maka shell mencoba mengeksekusi perintah (seolah-olah saya telah mengetik bash somefile). Saya tidak percaya ini, tetapi saya hanya mencobanya, dan itu benar. Jadi saya jelas memiliki kesalahpahaman tentang apa yang sebenarnya terjadi di sini, dan ingin memahami mekanika.
Apa yang sebenarnya terjadi ketika saya menjalankan file di shell saya? (Dalam banyak detail masuk akal ...)
source somefilesangat berbeda dari proses baru yang dipotong oleh ./somefile.
./somefileakan menyebabkan bash untuk mengeksekusi perintah somefilejika file tidak memiliki angka ajaib. Saya pikir itu hanya akan menampilkan kesalahan, dan sebaliknya itu muncul secara efektifsource somefile
somefileini adalah file teks, maka shell baru akan muncul jika saya mencoba untuk mengeksekusinya. File echo $$berperilaku berbeda jika saya mengeksekusi vs sumbernya.