Khi bạn gõ
./program
Vỏ cố gắng để thực hiện chương trình theo cách nó quyết định tập tin cần phải được thực thi. Nếu nó là nhị phân, nó sẽ cố gắng thực hiện chương trình con mục nhập. Nếu vỏ phát hiện đó là một kịch bản, ví dụ như thông qua việc sử dụng các
#!/bin/sh
hoặc
#!/bin/awk
hoặc tổng quát hơn
#!/path/to/interpreter
vỏ sẽ vượt qua các tập tin (và bất kỳ đối số cung cấp) làm đối số cho trình thông dịch được cung cấp, sau đó sẽ thực thi tập lệnh. Nếu trình thông dịch được cung cấp trong đường dẫn không tồn tại, trình bao sẽ bị lỗi và nếu không tìm thấy dòng thông dịch nào, shell sẽ giả định tập lệnh được cung cấp là do chính nó thực thi.
Một lệnh
sh program
tương đương với
./program
khi dòng đầu tiên của chương trình chứa
#!/bin/sh
giả định rằng/bin/sh là sh trong đường dẫn của bạn (nó có thể là/system/bin/sh, chẳng hạn). Việc chuyển một nhị phân sang sh sẽ khiến sh coi nó như là một kịch bản lệnh shell, nó không phải là, và nhị phân không phải là shell có thể diễn giải (là văn bản thuần túy). Đó là lý do tại sao bạn không thể sử dụng
sh program
trong ngữ cảnh này. Nó cũng sẽ thất bại do chương trình được ruby, awk, sed, hoặc bất cứ điều gì khác mà không phải là một kịch bản shell.
không nên là #!/Bin/sh? – Protostome