Vì vậy, tôi nghĩ rằng tôi đã hiểu rõ về điều này, nhưng chỉ cần chạy thử nghiệm (để đáp lại cuộc trò chuyện mà tôi không đồng ý với ai đó) và thấy rằng sự hiểu biết của tôi là thiếu sót ...
Càng chi tiết càng tốt những gì chính xác sẽ xảy ra khi tôi thực thi một tệp trong trình bao của mình? Ý tôi là, nếu tôi gõ: ./somefile some arguments
vào shell của mình và nhấn return (và somefile
tồn tại trong cwd, và tôi đã đọc + thực thi quyền trên somefile
) thì điều gì xảy ra dưới mui xe?
Tôi nghĩ câu trả lời là:
- Vỏ làm cho một
exec
tòa nhà cao tầng, đi qua con đường đếnsomefile
- Nhân kiểm tra
somefile
và xem số ma thuật của tệp để xác định xem đó có phải là định dạng mà bộ xử lý có thể xử lý không - Nếu số ma thuật chỉ ra rằng tệp có định dạng mà bộ xử lý có thể thực thi, thì
- một quy trình mới được tạo ra (với một mục trong bảng quy trình)
somefile
được đọc / ánh xạ vào bộ nhớ. Một ngăn xếp được tạo và thực thi nhảy đến điểm vào của mãsomefile
, vớiARGV
khởi tạo thành một mảng các tham số (achar**
,["some","arguments"]
)
- Nếu số ma thuật là một shebang thì
exec()
sinh ra một quy trình mới như trên, nhưng thực thi được sử dụng là trình thông dịch được tham chiếu bởi shebang (ví dụ/bin/bash
hoặc/bin/perl
) vàsomefile
được chuyển đếnSTDIN
- Nếu tệp không có số ma thuật hợp lệ, thì sẽ xảy ra lỗi như "tệp không hợp lệ (số ma thuật xấu): Lỗi định dạng Exec" xảy ra
Tuy nhiên, ai đó nói với tôi rằng nếu tệp là văn bản thuần túy, thì trình bao cố gắng thực thi các lệnh (như thể tôi đã gõ bash somefile
). Tôi đã không tin điều này, nhưng tôi chỉ thử nó, và nó đã đúng. Vì vậy, tôi rõ ràng có một số quan niệm sai lầm về những gì thực sự xảy ra ở đây, và muốn hiểu cơ học.
Điều gì chính xác xảy ra khi tôi thực thi một tập tin trong shell của tôi? (càng nhiều chi tiết là hợp lý ...)
source somefile
./somefile
mặc dù rất khác với một quy trình mới đang bị chặn lại .
./somefile
sẽ khiến bash thực thi các lệnh somefile
nếu tập tin không có số ma thuật. Tôi nghĩ rằng nó sẽ chỉ hiển thị một lỗi và thay vào đó nó có vẻ hiệu quảsource somefile
somefile
là tệp văn bản, thì trình bao mới sẽ xuất hiện nếu tôi cố thực thi nó. Một tập tin echo $$
hoạt động khác nhau nếu tôi thực hiện so với nguồn nó.