Một người bạn của tôi chỉ ra rằng nếu bạn làm:
perl -pi.bak -e 's/foo/bar/' somefile
khi "somefile" thực sự là một symlink, perl thực hiện đúng những gì các tài liệu nói nó sẽ làm:
Nó thực hiện điều này bằng cách đổi tên tệp đầu vào, mở tệp đầu ra theo tên gốc và chọn tệp đầu ra đó làm mặc định cho các câu lệnh print (). Tiện ích mở rộng, nếu được cung cấp, được sử dụng để sửa đổi tên của tệp cũ để tạo bản sao lưu [...]
Điều này dẫn đến một symlink mới "somefile.bak" chỉ đến tệp thực không thay đổi và một tệp thông thường mới, đã thay đổi "somefile" với các thay đổi.
Trong nhiều trường hợp, theo liên kết tượng trưng sẽ là hành vi mong muốn (ngay cả khi nó để lại vị trí chính xác của tệp .bak mơ hồ). Có cách nào đơn giản để làm việc này ngoài việc kiểm tra các liên kết tượng trưng trong trình bao bọc và xử lý trường hợp một cách thích hợp không?
( sed
làm điều tương tự, cho những gì đáng giá.)
-p -i
trong kịch bản của bạn.