Phiên bản mới nhất (kể từ năm 2017) của thông số POSIX cho rm
tiện ích có tại đây (và phiên bản trước đó ở đó ) và cấm xóa .
và ..
.
Nếu một trong hai dấu chấm hoặc dấu chấm chấm được chỉ định là phần tên cơ sở của toán hạng (nghĩa là thành phần tên đường dẫn cuối cùng) hoặc nếu toán hạng giải quyết vào thư mục gốc, rm sẽ viết thông báo chẩn đoán thành lỗi tiêu chuẩn và không làm gì cả nhiều hơn với các toán hạng như vậy.
Theo ghi nhận của @jlliagre, phần về /
là một bổ sung trong SUSv4.
Thông số Unix có sẵn công khai lâu đời nhất mà tôi có thể tìm thấy ( XPF4 CAE rev2 (1994)), đã chỉ định rằng .
và ..
không thể xóa được, mặc dù các nhận xét trong tệp thay đổi tệp GNU cho thấy nó đã là trường hợp trong thông số POSIX cũ hơn.
Lưu ý rằng nó áp dụng cho dir/..
và ../
là tốt, nhưng một số triển khai (kể cả UNIX chứng nhận như Solaris 11 và MacOS) vẫn không bảo vệ chống lại rm -rf ../
hoặc rm -rf .*/
).
lịch sử
Đoàn kết sớm
Các -r
tùy chọn để rm
được bổ sung trong Unix V3 (1973) mặc dù nó chỉ xóa nội dung của các thư mục, bạn vẫn sẽ cần phải sử dụng rmdir
để loại bỏ các thư mục.
Điều đó đã thay đổi trong Unix V7 (1979, bản phát hành cũng giới thiệu shell Bourne và từ đó hầu hết các Unices đều xuất phát). rm -r
bây giờ cũng loại bỏ các thư mục và sẽ không xóa ..
cây thư mục. Các trang người đàn ông bang:
Cấm xóa tệp ..
chỉ để tránh hậu quả chống xã hội do vô tình làm điều gì đó như thế nào rm -r .*
.
(mặc dù người ta có thể lập luận rằng rm -r .*
vẫn chống đối xã hội vì nó xóa mọi thứ vì .
được bao gồm).
Nó vẫn chấp nhận xóa .
mặc dù nó sẽ không hủy liên kết .
hoặc ..
các mục. Vì vậy, sau đó, rm -r .
là một cách hiệu quả để làm trống thư mục hiện tại.
Cũng lưu ý rằng các biện pháp bảo vệ chỉ dành cho một ..
cuộc tranh luận theo nghĩa đen , không phải cho dir/..
hoặc ./..
. Vì vậy, rm -rf ./.*
vẫn sẽ loại bỏ mọi thứ trong thư mục cha theo cách đệ quy.
Thật thú vị khi thấy rằng điều đó đã khắc phục được lỗi / lỗi không phù hợp bằng cách mà các khối có thể bao gồm .
và ..
trong bản mở rộng của chúng. Điều đó đã được cố định trong trình bao Forsyth (cơ sở cho trình bao Minix gốc và pdksh) vào cuối những năm 80, zsh
(1990) và fish
(2005) nhưng không phải là các trình bao khác và đặc biệt không phải là sh
ngôn ngữ POSIX yêu cầu mở rộng .*
để bao gồm .
và ..
nếu chúng được trả về bởi readdir()
( bash
giải quyết vấn đề một phần chỉ với shopt -s dotglob
nơi mà các khối u (trừ .xxx
những vấn đề) không bao gồm .
hoặc ..
, và với ksh
, bạn có thể khắc phục bằng cách thực hiện FIGNORE='@(.|..)'
).
Khi chính xác việc cấm .
cũng được thêm vào không phải lúc nào cũng rõ ràng và thay đổi theo từng Unix. Một vài phát hiện dưới đây.
BSD
Việc cấm .
được thêm vào khoảng giữa 2.9BSD (1983) và 2.10BSD (1987) và giữa 4.2BSD (1983) và 4.3BSD (1986) (xem thay đổi này được đánh dấu thời gian 1985 trong unix-history-repo ).
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");
Cho dir/.
và dir/..
, xem thay đổi này vào năm 1988 (BSD 4.3 Net / 1).
Cho đến ngày nay, rm
FreeBSD (và các công cụ phái sinh như macOS) vẫn làm trống thư mục hiện tại hoặc thư mục gốc rm -rf ./
hoặc rm -rf ../
mặc dù (quan trọng đối với rm -rf .*/
).
Hệ thống V
Tôi không có nhiều thông tin vì cả nguồn và nhị phân đều không có sẵn công khai cho các dẫn xuất Unix của AT & T sau V7. Trong hướng dẫn trực tuyến của mình, HPUX (dựa trên Hệ thống III) vẫn đề cập rằng nó chỉ cấm ..
trong khi thực tế nó cấm cả hai đó là một dấu hiệu cho thấy ít nhất SysIII đã không cấm xóa .
( chỉnh sửa : Bây giờ hãy xem mã nguồn SysIIIrm
, đó là hầu như không thay đổi kể từ Unix V7).
Tất cả các hướng dẫn sử dụng trực tuyến khác mà tôi đã kiểm tra đề cập đến việc xóa .
hoặc ..
bị cấm dự kiến là tuân thủ POSIX.
Solaris rm
vẫn làm trống thư mục hiện tại hoặc cha mẹ trên rm -rf ./
hoặc rm -rf ../
.
GNU
Thay đổi sớm cho tập tin GNU có tất cả các thông tin lịch sử.
Mặc dù ban đầu không xóa .
hoặc ..
bị cấm, ..
trước tiên bị cấm và sau đó cả hai (bao gồm dir/.
), tất cả từ năm 1990 đến 1991.
khác
Như chúng ta đã thấy, trong zsh
, việc mở rộng .*
(hoặc bất kỳ toàn cầu) không bao giờ bao gồm .
hoặc ..
(ngay cả trong sh
chế độ mô phỏng). Do đó, phần rm
dựng sẵn (mà bạn nhận được nếu bạn zmodload zsh/files
) do đó không xử lý .
hoặc ..
đặc biệt. Vì vậy, với zsh
nội dung đó , bạn có thể rm -rf .
hoặc rm -rf ..
để trống .
hoặc ..
, nhưng rm -rf .*
sẽ không xóa .
hoặc ..
.
Trong busybox rm
, việc cấm xóa .
và ..
được thêm vào 0,52 (2001)
rm
, nhưng tôi nghĩ rằng nó là đáng nói rằng bạn vẫn có thể có kết quả bất ngờ vớichmod
,chown
, vv khi kết hợp.*
.