Dòng #


142

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/shkhi bắt đầu là gì?



2
Tốt giải thích về askubuntu: askubuntu.com/questions/141928/...
fkoessler


Câu trả lời:


143

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/whateverphần này, có thể là lỗi cú pháp trong ngôn ngữ cụ thể đó.


6
Nó thường là kernel, không phải shell, xử lý cái này. Shell chỉ đơn giản gọi cuộc gọi exec()hệ thống trên tập tin.
tripleee

47

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 lessvà 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.


10

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/shví dụ.

Có một bài viết Wikipedia về nó để biết thêm thông tin.


5

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.).


-4

#!/bin/shhoặc #!/bin/bashphả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/shnó 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 pslệ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

1
Stack Overflow không phải là Twitter. Hãy dành thời gian để thực sự đánh vần các từ như "u" và "1st". Bạn đang giúp viết một cuốn sách tham khảo để ngữ pháp và chính tả đúng là rất quan trọng. Ngoài ra, chú ý đến định dạng thích hợp. Các lệnh sẽ được ban hành từ dòng lệnh, như psvà đoạn trích mã như thế #!/bin/shnên được định dạng.
Tin Man

Tôi đã cố gắng để làm sạch tiếng Anh ở đây nhưng tôi vẫn không chắc nó có nghĩa gì. Tôi đoán câu trả lời cố gắng nói rằng các lệnh trong tập lệnh sẽ được thực thi dưới dạng các lệnh riêng biệt và việc thêm một shebang sẽ hiển thị tập lệnh dưới dạng một lệnh trong danh sách quy trình. Điều này không thực sự đúng.
tripleee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.