Nếu bạn tạo một tệp thực thi với các nội dung sau và chạy nó, nó sẽ tự xóa.
Cái này hoạt động ra sao?
#!/bin/rm
rm
, nó là về #!
. Câu hỏi có thể được nhắc lại về cách thực hiện bất kỳ tập lệnh thực thi nào với một #!
tác phẩm.
Nếu bạn tạo một tệp thực thi với các nội dung sau và chạy nó, nó sẽ tự xóa.
Cái này hoạt động ra sao?
#!/bin/rm
rm
, nó là về #!
. Câu hỏi có thể được nhắc lại về cách thực hiện bất kỳ tập lệnh thực thi nào với một #!
tác phẩm.
Câu trả lời:
Hạt nhân diễn giải dòng bắt đầu bằng #!
và sử dụng nó để chạy tập lệnh, chuyển qua tên của tập lệnh; vì vậy điều này kết thúc chạy
/bin/rm scriptname
trong đó xóa tập lệnh. (Như Stéphane Chazelas chỉ ra , scriptname
đây là đủ để tìm ra kịch bản - nếu bạn chỉ định một đường dẫn tương đối hoặc tuyệt đối, đó là thông qua tại như-là, nếu không bất cứ con đường được tìm thấy trong PATH
được thêm vào phía trước, trong đó có thể là chuỗi emptry nếu bạn PATH
chứa đó và tập lệnh nằm trong thư mục hiện tại. Bạn có thể phát xung quanh với tập lệnh echo - #!/bin/echo
- để xem cách hoạt động của tập lệnh này.)
Như hobbs đã chỉ ra, điều này có nghĩa là kịch bản của bạn thực sự là một rm
kịch bản, không phải là một bash
kịch bản - cái sau sẽ bắt đầu bằng #!/bin/bash
.
Xem cách các chương trình được chạy để biết chi tiết về cách thức hoạt động trong Linux; các ý kiến về bài viết đó cung cấp chi tiết cho các nền tảng khác. #!
được gọi là shebang, bạn sẽ tìm thấy nhiều thông tin bằng cách tìm kiếm cụm từ đó (nhờ Aaron cho gợi ý). Như jlp đã chỉ ra, bạn cũng sẽ thấy nó được gọi là "pound bang" hoặc "hash bang" ( #
thường được gọi là "pound" - ở các quốc gia không sử dụng £
- hoặc "băm" và !
là "bang" ). Wikipedia có thêm thông tin.
rm
sẽ là đường dẫn đến tập lệnh, đó là đối số đầu tiên cho lệnh gọi hệ thống execve () được thực hiện bởi quy trình. Thông thường, nếu bạn chạy các kịch bản như ./scriptname
, đó sẽ là ./scriptname
và nếu bạn gọi nó như là scriptname
, đó sẽ là /path/to/scriptname
nơi /path/to
là mục trong $PATH
nơi kịch bản đó đã được tìm thấy. Thông thường, nó sẽ chỉ bởi scriptname
nếu bạn có chuỗi rỗng trong $PATH
và bạn đã gọi kịch bản như scriptname
và scriptname
là trong thư mục hiện hành.