Đừng quên khả năng máy chủ không thể truy cập được sau khi rm
lệnh không liên quan gì đến điều đó. Nó có thể là một sự trùng hợp!
Mặc dù rất có thể, thư mục làm việc hiện tại không như bạn nghĩ, khi lệnh được ban hành.
Bạn đã root khi làm điều này?
Đây là những gì xảy ra khi ban hành lệnh rm -rf *
:
- Shell giải quyết các mẫu ký tự đại diện (
*
trong trường hợp này) cho tất cả các tệp (bao gồm các thư mục, liên kết tượng trưng và các tệp đặc biệt của thiết bị) phù hợp với mẫu hình cầu được sử dụng, trong trường hợp này mọi thứ không bắt đầu bằng .
Thông thường, chúng được sắp xếp theo "bảng chữ cái" theo vỏ.
- Shell sau đó tạo ra một quy trình mới và
exec()
là phiên bản đầu tiên rm
được tìm thấy trong của bạn $PATH
, với -rf
tư cách là đối số đầu tiên và các tệp được khớp, từng cái một làm các đối số liên tiếp.
Nếu lệnh rm
được gọi là rm
lệnh tiêu chuẩn , trước tiên, nó phân tích cú pháp từng đối số, xử lý tất cả các đối số (bao gồm cả các đối số do shell shellbing) bắt đầu bằng một -
tùy chọn cho đến khi nó xuất hiện một đối số không bắt đầu bằng -
( ngoại trừ các lệnh sử dụng GNU getopt()
chấp nhận các tùy chọn sau khi không có tùy chọn) hoặc một lệnh chính xác --
. Tất cả mọi thứ sau đó được coi là tên tập tin.
Nói cách khác, nếu bạn có một tệp được gọi (ví dụ) --no-preserve-root
trong thư mục hiện tại, thì đó sẽ được hiểu là một tùy chọn rm
, không phải là tên tệp để xóa!
Hãy cẩn thận với các ký tự đại diện (và với cách đặt tên tệp). Nếu bạn có một tệp được gọi -r
trong thư mục hiện tại, lệnh ls *
sẽ liệt kê các tệp khác theo thứ tự ngược lại và không hiển thị tệp '-r'.
Nói cách khác, nếu bạn có một tệp được gọi --no-preserve-root
, nó sẽ được chuyển qua dưới dạng tùy chọn rm
chứ không phải là tên tệp.
Sử dụng rm -rf -- *
để ngăn điều đó xảy ra và cũng loại bỏ các tệp bắt đầu bằng -
. Hoặc đơn giản là sử dụng tên đường dẫn tuyệt đối hoặc tương đối để làm cho tên tệp bắt đầu bằng một cái gì đó khác -
, như trong: rm ./--flagfile
hoặc rm /abs/path/to/--flagfile
.
Ngoài ra còn có một -i
cờ để rm
làm cho nó nhắc ("tương tác") trước khi xóa bất cứ điều gì.
rm -rf *
thực hiện khá nhiều như bạn nói (không bao gồm thực tế là nó bỏ qua các tập tin ẩn). Nói chung, tốt hơn là nên đi lên một thư mục vàrm -r
chính thư mục đó, tạo lại nó nếu cần thiết.