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 arguments
ke dalam shell saya dan tekan kembali (dan somefile
ada 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
somefile
dan 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)
somefile
dibaca / dipetakan ke memori. Tumpukan dibuat dan eksekusi melompat ke titik masuk kodesomefile
, denganARGV
diinisialisasi 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/bash
atau/bin/perl
) dansomefile
diteruskan 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 somefile
sangat berbeda dari proses baru yang dipotong oleh ./somefile
.
./somefile
akan menyebabkan bash untuk mengeksekusi perintah somefile
jika file tidak memiliki angka ajaib. Saya pikir itu hanya akan menampilkan kesalahan, dan sebaliknya itu muncul secara efektifsource somefile
somefile
ini adalah file teks, maka shell baru akan muncul jika saya mencoba untuk mengeksekusinya. File echo $$
berperilaku berbeda jika saya mengeksekusi vs sumbernya.