Làm thế nào `: w! Sudo tee%` hoạt động


27

Nếu bạn mở một tệp mà bạn không có quyền ghi vào vim, sau đó quyết định bạn cần thay đổi nó, bạn có thể viết các thay đổi của mình mà không cần thoát vim bằng cách :w !sudo tee %
tôi không hiểu cách này có thể hoạt động. Bạn có thể vui lòng mổ xẻ điều này?
Tôi hiểu :wmột phần, nó ghi bộ đệm hiện tại vào đĩa, giả sử đã có một tên tệp được liên kết với nó, phải không?
Tôi cũng hiểu cái !nào thực thi sudo teelệnh và %thể hiện nội dung bộ đệm hiện tại phải không?
Nhưng vẫn không hiểu làm thế nào điều này hoạt động.

Câu trả lời:


30

Cấu trúc :w !cmdcó nghĩa là "ghi bộ đệm hiện tại được dẫn qua lệnh". Vì vậy, bạn có thể làm, ví dụ :w !catvà nó sẽ dẫn bộ đệm qua cat.

Bây giờ %tên tệp được liên kết với bộ đệm

Vì vậy, :w !sudo tee %sẽ ống nội dung của bộ đệm thông qua sudo tee FILENAME. Điều này có hiệu quả ghi nội dung của bộ đệm ra tập tin.



2

Không hoàn toàn đúng!

!commandchạy lệnh như một lệnh lọc , lấy văn bản từ stdin, làm một cái gì đó và xuất ra stdout.

Bằng cách sử dụng w, bạn đẩy nội dung tập tin để stdincủa sudo tee %. %là thanh ghi đặc biệt trong vim, chứa tên của tệp hiện tại.

Vì vậy, bạn đã nhận sudo tee FILENAME, sẽ đẩy tee stdin- nội dung tệp - đến tệp hiện tại.


2
:!commandlà một bộ lọc (xem :h !), trong khi :w !commandkhông, nó chỉ thực thi commandvới tệp hiện tại là stdin(xem :h :w_c). To wit: :w !sed /./dkhông thay đổi nội dung của bộ đệm hiện tại. Nhưng công thức thực sự không hoàn toàn đúng vì một lý do khác, %cần phải được thoát : :exec 'w !sudo tee ' . shellescape(expand('%', 1)). Lệnh ban đầu không hoạt động với tên tệp có dấu cách.
Satō Katsura
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.