Để hiểu điều này, bạn phải nhận ra rằng dòng đầu tiên của tập lệnh thực sự được đọc hai lần , bởi 2 chương trình khác nhau. Lần đầu tiên, kernel mở tệp và tìm chuỗi ký tự đó ( #!
) trên dòng đầu tiên. Nếu nó tìm thấy nó, nó chạy chương trình shell được chỉ định ở đó, truyền tên tệp dưới dạng tham số. (ví dụ: nếu tệp /home/me/foo
bắt đầu bằng #!/bin/sh
, kernel sẽ chạy /bin/sh /home/me/foo
).
Tiếp theo trình bao ( bin/sh
hoặc bất kỳ chương trình thông dịch nào đã được chỉ định) đọc tệp. Shell không biết gì về các dòng shebang nhưng nó vẫn sẽ đọc dòng đầu tiên vì nó giống như bất kỳ dòng nào khác trong tệp ... nó đọc tất cả. Bạn không muốn cái vỏ bị sập hoặc thay đổi hành vi của nó theo bất kỳ cách nào ... cách để làm điều đó là làm cho nó được coi là một nhận xét và bỏ qua nó. Do đó, ký tự tốt nhất cho một lệnh kernel bắt đầu sẽ là ký tự nhận xét.
#!
(nhiều như dmr nhớ về), bao gồm cả lời giải thích tại sao#
(vâng, dòng này phải bị bỏ qua bởi các shell hiện có).