Tôi luôn tò mò tại sao lệnh xóa mọi thứ trong một thư mục là rm -rf
.
Tại sao không có cờ để làm điều tương tự rmdir
?
Nó sẽ không trực quan hơn để sử dụng rmdir
cho các hoạt động thư mục?
Tôi luôn tò mò tại sao lệnh xóa mọi thứ trong một thư mục là rm -rf
.
Tại sao không có cờ để làm điều tương tự rmdir
?
Nó sẽ không trực quan hơn để sử dụng rmdir
cho các hoạt động thư mục?
Câu trả lời:
Trong hệ thống tệp Unix đầu tiên (ít nhất là trong các thư mục V7 ngày khoảng năm 1970) đã được triển khai dưới dạng các tệp đặc biệt và chỉ root mới có thể sử dụng lệnh mknod(2)
gọi hệ thống đã tạo ra chúng và chỉ root mới có thể tạo unlink(2)
một tệp đặc biệt cho thư mục.
Những biện pháp bảo vệ này được đưa ra để giữ cho cấu trúc hệ thống tập tin nhất quán. Ví dụ: nếu người dùng được phép ghi vào một tệp đặc biệt của thư mục, anh ta có thể làm cho thư mục mẹ của nó ..
trỏ đến chính nó (cụ thể là nút i của chính nó). Điều này sẽ tạo ra một tham chiếu vòng tròn trong hệ thống tập tin sẽ là một điều xấu. Tất nhiên có những mâu thuẫn khác người ta có thể làm, đây chỉ là một ví dụ rõ ràng.
Tính nhất quán được duy trì bởi các chương trình không gian người dùng như mkdir(1)
và rmdir(1)
gốc Set-UID để họ có thể thực hiện các cuộc gọi hệ thống đặc quyền thay mặt cho người dùng không có đặc quyền. Khi đệ quy được thêm vào rm(1)
, lệnh remove sẽ chạy như UID hiện tại và sau đó gọi ra rmdir(1)
chỉ để xóa các thư mục trống. Đây vẫn là một phương pháp nâng cao quyền tiêu chuẩn khá: không sử dụng nhiều quyền hơn bạn cần.
Một thời gian sau mkdir(2)
và rmdir(2)
được thêm vào như các cuộc gọi hệ thống của riêng họ nhưng mối quan hệ giữa rm(1)
và rmdir(1)
vẫn còn.
Cá nhân, tôi thấy nó hài lòng hơn rmdir junk
và biết rằng điều tồi tệ nhất tôi đã làm là xóa một thư mục trống.
rmdir
, nó vẫn sẽ cần một -r
cờ. ( rmdir -r junk
thay vì rm -r junk
và rmdir junk
vẫn chỉ hoạt động nếu thư mục trống)
Đó là lịch sử. rm
đã được thực hiện để loại bỏ các tham chiếu đến các tập tin, rmdir
được thực hiện để loại bỏ các thư mục, song song với mkdir
. Nhiều năm trước, Unix rm
chỉ có thể xóa các thư mục bằng cách gọi rmdir
. Cũng không có một rmdir(2)
cuộc gọi hệ thống, rmdir
là một chương trình được gọi unlink(2)
.
Người giới thiệu:
Hoàn toàn là một vấn đề quan điểm, nhưng rm
loại bỏ các tập tin trong khi rmdir
loại bỏ các thư mục. Thư mục là một tệp, nhưng là một loại tệp đặc biệt, vì vậy sẽ rất hợp lý rm
khi xóa chúng, nhưng phải xử lý chúng đặc biệt (nghĩa là yêu cầu thêm tùy chọn để bật khả năng.) Mặt khác, không phải tất cả các tệp đều là thư mục, và nó không có ý nghĩa IMHO rmdir
để loại bỏ một cái gì đó không phải là một thư mục.
rm
xóa một thư mục trống (ngoại trừ trong chế độ đệ quy)?
-r
cờ để kích hoạt tính năng tệp đặc biệt của thư mục.
rmdir
xóa thư mục,rm
xóa. Tại sao nó sẽ trực quanrmdir
để loại bỏ các thư mục không?