Tại sao đoạn script sau tự xóa?


84

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


@DigitalTrauma Heh, đó là suy nghĩ đầu tiên của tôi khi tôi nhìn thấy điều này.
con mèo

Nó không phải là về 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.
njzk2

1
Làm thế nào bạn quản lý để vấp ngã trên này?
dùng1717828

1
Đó chắc chắn là một câu hỏi sử thi. Tôi rất tiếc rằng tôi chỉ có thể nâng cấp nó một lần.
Danila Kiver

Câu trả lời:


112

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 PATHchứ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 rmkịch bản, không phải là một bashkị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.


9
Tên khác cho "#!" bạn có thể nghe thấy là "pound bang" và "hash bang". Xem en.wikipedia.org/wiki/Shebang_(Unix) để biết chi tiết.
jlp

@jlp Pound bang? Có phải giống như "bang for buck của bạn"? Heh ...
con mèo

Nhắc tôi nhớ về ol ' CrunchBang
Xen2050

1
Về mặt kỹ thuật, đối số rmsẽ 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à ./scriptnamevà nếu bạn gọi nó như là scriptname, đó sẽ là /path/to/scriptnamenơi /path/tolà mục trong $PATHnơi kịch bản đó đã được tìm thấy. Thông thường, nó sẽ chỉ bởi scriptnamenếu bạn có chuỗi rỗng trong $PATHvà bạn đã gọi kịch bản như scriptnamescriptnamelà trong thư mục hiện hành.
Stéphane Chazelas
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.