Giả sử bạn biết mục tiêu là một liên kết tượng trưng và không phải là một tệp, có sự khác biệt nào giữa việc sử dụng rm
và unlink
xóa liên kết không?
Giả sử bạn biết mục tiêu là một liên kết tượng trưng và không phải là một tệp, có sự khác biệt nào giữa việc sử dụng rm
và unlink
xóa liên kết không?
Câu trả lời:
Bất cứ khi nào bạn có những loại câu hỏi này, tốt nhất nên nghĩ ra một bài kiểm tra nhỏ để xem điều gì thực sự xảy ra. Đối với điều này, bạn có thể sử dụng strace
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Khi bạn xem 2 tệp nhật ký kết quả, bạn có thể "thấy" mỗi cuộc gọi đang thực sự làm gì.
Với unlink
nó gọi unlink()
cuộc gọi hệ thống:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
Với rm
một con đường hơi khác:
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
Hệ thống gọi unlink()
và unlinkat()
về cơ bản là giống nhau ngoại trừ sự khác biệt được mô tả trong trang man này: http://linux.die.net/man/2/unlinkat .
Cuộc gọi hệ thống unlinkat () hoạt động chính xác giống như hủy liên kết (2) hoặc rmdir (2) (tùy thuộc vào việc các cờ có bao gồm cờ AT_REMOVEDIR hay không) ngoại trừ các khác biệt được mô tả trong trang hướng dẫn này.
Nếu tên đường dẫn được đặt trong tên đường dẫn là tương đối, thì nó được hiểu tương đối với thư mục được gọi bởi bộ mô tả tệp dirfd (chứ không phải liên quan đến thư mục làm việc hiện tại của quá trình gọi, như được thực hiện bởi unlink (2) và rmdir (2 ) cho một tên đường dẫn tương đối).
Nếu tên đường dẫn được đặt trong tên đường dẫn là tương đối và dirfd là giá trị đặc biệt AT_FDCWD, thì tên đường dẫn được hiểu tương ứng với thư mục làm việc hiện tại của quá trình gọi (như unlink (2) và rmdir (2)).
Nếu tên đường dẫn được đặt trong tên đường dẫn là tuyệt đối, thì dirfd sẽ bị bỏ qua.
AT_FDCWD
, nên thực sự không có sự khác biệt giữa unlink
và unlinkat
.
POSIX chỉ định rằng unlink
tiện ích gọi unlink
hàm thư viện C và không có gì khác. Nó không có tùy chọn. Nếu bạn chuyển một tên đường dẫn hợp lệ cho một cái gì đó không phải là một thư mục và nếu bạn có quyền ghi vào thư mục nơi đối tượng đó sống, thì unlink
sẽ xóa nó.
rm
là một lệnh Unix truyền thống có một chút chức năng khác và không hoàn toàn thay thế unlink
(xem bên dưới).
Thứ nhất, rm
thực hiện kiểm tra an toàn. Nếu bạn cố gắng để rm
một đối tượng mà bạn không có quyền ghi (không liên quan đến khả năng loại bỏ của bạn: thì quyền trực tiếp là!) rm
Tuy nhiên từ chối trừ khi -f
được chỉ định. rm
thường phàn nàn nếu tập tin không tồn tại, như vậy unlink
; tuy nhiên với -f
, rm
không phàn nàn. Điều này thường được khai thác trong Makefiles ( clean: @rm -f $(OBJS) ...
) vì vậy make clean
không thất bại khi không có gì để xóa.
Thứ hai, rm
có -i
tùy chọn để tương tác xác nhận xóa.
Thứ ba, rm
đã -r
xóa đệ quy một thư mục, đây là điều unlink
không bắt buộc phải làm, vì chức năng thư viện C không làm điều đó.
Các unlink
tiện ích không chính xác là một tước bỏ rm
. Nó thực hiện một tập hợp con của những gì rm
, nhưng nó có ngữ nghĩa là sự kết hợp rm
với -f
và rm không có -f
.
Giả sử bạn muốn xóa một tệp thông thường bất kể quyền của chính nó là gì. Hơn nữa, giả sử bạn muốn lệnh thất bại nếu tệp không tồn tại hoặc bất kỳ lý do nào khác. Không rm file
phải cũng không rm -f file
đáp ứng yêu cầu. rm file
sẽ từ chối nếu tập tin không thể ghi. Nhưng rm -f file
sẽ bỏ qua khiếu nại nếu tập tin bị thiếu. unlink file
Làm công việc.
unlink
có lẽ đã được giới thiệu vì rm
quá thông minh: đôi khi bạn chỉ muốn unlink
ngữ nghĩa thuần túy của Unix : "vui lòng làm cho mục nhập thư mục này biến mất nếu quyền của thư mục cho phép" .
unlink
chứ không phải là sự khác biệt chỉ là mô tả.
Với một tệp duy nhất, rm và hủy liên kết thực hiện cùng một tác vụ, xóa tệp. Như POSIX đã xác định rm
và unlink
cả hai cuộc gọi đến cuộc gọi hệ thống hủy liên kết () .
Trong GNU rm
, nó gọi tới lệnh gọi hệ thống unlinkat () , tương đương với hàm unlink()
hoặc rmdir () trừ trường hợp đường dẫn chỉ định đường dẫn tương đối.
Ghi chú
Trên một số hệ thống, unlink
cũng có thể loại bỏ thư mục. Ít nhất là trong hệ thống GNU, unlink
không bao giờ có thể xóa tên của một thư mục.