Tôi có thể nghĩ ra hai cách để làm điều này.
Cách đầu tiên giả sử bạn sở hữu tệp, nhưng tệp là S READN SÀNG.
Chỉ cần sử dụng hậu tố dấu chấm than của vi vào lệnh ghi (: w!) Để buộc ghi đè lên tệp READONLY của riêng bạn. Điều này tất nhiên giả định rằng bạn có quyền viết và thực thi trong thư mục hiện tại.
:w!
sẽ khiến vi ghi đè lên tệp S READN SÀNG ban đầu.
Cách thứ hai giả định người khác sở hữu tệp và bạn muốn lưu các thay đổi của mình vào tệp đó.
Một cách để thực hiện điều này là lưu các thay đổi được thực hiện cho tệp gốc dưới dạng tập lệnh ed từ bên trong vi. Tập lệnh ed này có thể được áp dụng cho tệp gốc (hoặc các tệp tương tự khác) sau đó ngoài vi với trình chỉnh sửa dòng ed.
Một cách để lưu phiên chỉnh sửa hiện tại dưới dạng tập lệnh ed là chuyển tên tệp gốc và bộ đệm vi đã chỉnh sửa làm đầu vào tiêu chuẩn cho tiện ích diff bằng công tắc dòng lệnh --ed, tức là hiển thị sự khác biệt dưới dạng tập lệnh ed.
Vì vậy, giả sử một bộ đệm vi đã chỉnh sửa, sau đó thực hiện như sau
:.,$!diff --ed [original_file] -
Điều này thay thế tất cả các dòng trong bộ đệm hiện tại (., $!) Bằng tập lệnh ed được tạo khác biệt (diff --ed [original_file] -) cần thiết để chuyển đổi tệp gốc thành nội dung của bộ đệm hiện tại. Sau đó, chúng tôi muốn lưu tập lệnh ed này vào một nơi an toàn và áp dụng tập lệnh vào phiên bản của tập tin gốc mà chúng tôi có thể ghi vào. Vì vậy, hãy lưu tập lệnh vào vị trí có thể ghi, ví dụ: thư mục đăng nhập của bạn:
:w ~/my_ed_script
Bây giờ hãy thoát vi và sử dụng tập lệnh ed này để lấy tệp đã chỉnh sửa không thể lưu ở vị trí đầu tiên. Đây là cách thực hiện điều đó từ dấu nhắc dòng lệnh bash, '$':
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
Chuỗi lệnh này thực hiện trong các từ là để catenate script mà chúng ta đã tạo với diff và lặp lại lệnh ed write, 'w', với đầu vào tiêu chuẩn của ed. Sau đó, Ed áp dụng tập lệnh này vào bản sao có thể ghi của tệp gốc và ghi những thay đổi bộ đệm đã sửa đổi đó trở lại tệp.
Vì vậy, đó là một cách để lưu công việc được thực hiện trong vi vào một tệp mà ban đầu được sở hữu bởi người khác sử dụng vi, diff và ed.