Tôi đã xem qua một số hướng dẫn về kịch bản shell và tìm thấy chương trình mẫu sau:
#!/bin/sh
clear
echo "HELLO WORLD"
Bất cứ ai có thể xin vui lòng cho tôi biết tầm quan trọng của bình luận #!/bin/sh
khi bắt đầu là gì?
Tôi đã xem qua một số hướng dẫn về kịch bản shell và tìm thấy chương trình mẫu sau:
#!/bin/sh
clear
echo "HELLO WORLD"
Bất cứ ai có thể xin vui lòng cho tôi biết tầm quan trọng của bình luận #!/bin/sh
khi bắt đầu là gì?
Câu trả lời:
Nó được gọi là shebang và nói với shell cha nên sử dụng trình thông dịch nào để thực thi tập lệnh.
ví dụ
#!/usr/bin/perl <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.
Nó được triển khai như một bình luận để mọi thứ trong dòng đó sẽ không "phù hợp" với trình thông dịch được chỉ định. ví dụ: tất cả các ngôn ngữ kịch bản có xu hướng hiểu rằng một dòng bắt đầu bằng #
một nhận xét và sẽ bỏ qua !/usr/bin/whatever
phần này, có thể là lỗi cú pháp trong ngôn ngữ cụ thể đó.
exec()
hệ thống trên tập tin.
Khi bạn cố gắng thực hiện một chương trình trong unix (một chương trình có tập bit thực thi), hệ điều hành sẽ xem xét một vài byte đầu tiên của tệp. Chúng tạo thành cái gọi là "số ma thuật", có thể được sử dụng để quyết định định dạng của chương trình và cách thực hiện nó.
#!
tương ứng với số ma thuật 0x2321 (tra cứu nó trong bảng ascii). Khi hệ thống thấy số ma thuật đó, nó biết rằng nó đang xử lý một tập lệnh văn bản và đọc cho đến lần tiếp theo \n
(có giới hạn, nhưng nó thoát khỏi máy atm của tôi). Khi đã xác định được trình thông dịch (đối số đầu tiên sau shebang), nó sẽ gọi trình thông dịch.
Các tập tin khác cũng có số ma thuật. Hãy thử nhìn vào tệp bitmap (.BMP) qua less
và bạn sẽ thấy hai ký tự đầu tiên là BM
. Con số ma thuật này biểu thị rằng tập tin thực sự là một bitmap.
Nếu tệp mà tập lệnh này tồn tại có thể thực thi được, hàm băm ( #!
) cho hệ điều hành biết trình thông dịch nào sẽ sử dụng để chạy tập lệnh. Trong trường hợp này, nó là /bin/sh
ví dụ.
Có một bài viết Wikipedia về nó để biết thêm thông tin.
Dòng đầu tiên nói với shell rằng nếu bạn thực thi trực tiếp tập lệnh (./run.sh; trái ngược với / bin / sh run.sh), thì nên sử dụng chương trình đó (/ bin / sh trong trường hợp này) để diễn giải nó.
Bạn cũng có thể sử dụng nó để truyền các đối số, thường là -e (thoát lỗi) hoặc sử dụng các chương trình khác (/ bin / awk, / usr / bin / perl, v.v.).
#!/bin/sh
hoặc #!/bin/bash
phải là dòng đầu tiên của tập lệnh bởi vì nếu bạn không sử dụng nó trên dòng đầu tiên thì hệ thống sẽ coi tất cả các lệnh trong tập lệnh đó là các lệnh khác nhau. Nếu dòng đầu tiên là #!/bin/sh
nó sẽ coi tất cả các lệnh là một tập lệnh và nó sẽ hiển thị rằng tệp này đang chạy trong ps
lệnh chứ không phải các lệnh bên trong tệp.
./echo.sh
ps -ef |grep echo
trainee 3036 2717 0 16:24 pts/0 00:00:00 /bin/sh ./echo.sh
root 3042 2912 0 16:24 pts/1 00:00:00 grep --color=auto echo
ps
và đoạn trích mã như thế #!/bin/sh
nên được định dạng.