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 argumentsvào shell của mình và nhấn return (và somefiletồ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
exectòa nhà cao tầng, đi qua con đường đếnsomefile - Nhân kiểm tra
somefilevà 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ớiARGVkhở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/bashhoặ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./somefilemặc dù rất khác với một quy trình mới đang bị chặn lại .
./somefilesẽ khiến bash thực thi các lệnh somefilenế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
somefilelà 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ó.