Bạn, glen
là chủ sở hữu của thư mục (xem .
tệp trong danh sách của bạn). Một thư mục chỉ là một danh sách các tệp và bạn có quyền thay đổi danh sách này (ví dụ: thêm tệp, xóa tệp, thay đổi quyền sở hữu để biến nó thành của bạn một lần nữa, v.v.). Bạn có thể không thể thay đổi trực tiếp nội dung của tệp, nhưng bạn có thể đọc và hủy liên kết (xóa) toàn bộ tệp và thêm tệp mới sau đó. 1 Chỉ chứng kiến trước và sau, điều này có thể trông giống như tập tin đã bị thay đổi.
Vim sử dụng các tệp hoán đổi và di chuyển các tệp xung quanh dưới nước, vì vậy điều đó giải thích tại sao nó dường như ghi vào cùng một tệp như bạn làm trong vỏ của mình, nhưng đó không phải là điều tương tự. 2
Vì vậy, những gì Vim làm, đi xuống này:
cat temp > .temp.swp # copy file by contents into a new glen-owned file
echo nope >> .temp.swp # or other command to alter the new file
rm temp && mv .temp.swp temp # move temporary swap file back
1 Đây là một sự khác biệt quan trọng trong việc xử lý quyền của tệp giữa Windows và Unices. Trong Windows, người ta thường không thể xóa các tệp mà bạn không có quyền ghi.
2 cập nhật: như đã lưu ý trong các bình luận, Vim không thực sự làm theo cách này để thay đổi quyền sở hữu, vì số inode trên temp
tệp không thay đổi ( ls -li
trước và sau). Sử dụng strace
chúng ta có thể thấy chính xác những gì vim
không. Phần thú vị ở đây:
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = -1 EACCES (Permission denied)
unlink("temp") = 0
open("temp", O_WRONLY|O_CREAT|O_TRUNC, 0664) = 4
write(4, "more text bla\n", 14) = 14
close(4) = 0
chmod("temp", 0664) = 0
Điều này cho thấy rằng nó chỉ bỏ liên kết , nhưng không đóng bộ mô tả tệp temp
. Nó thay vì chỉ ghi đè lên toàn bộ nội dung của nó ( more text bla\n
trong trường hợp của tôi). Tôi đoán điều này giải thích tại sao số inode không thay đổi.
ls -il
trước và sau ... nếutemp
số inode thay đổi, bạn biết đó là một tệp khác có cùng tên.