Як працює `: w! Sudo tee%`?


27

Якщо ви відкриєте файл, на який у вас немає дозволу писати в vim, вирішите, що вам потрібно його змінити, ви можете записати свої зміни, не виходячи з vim, зробивши це, :w !sudo tee %
я не розумію, як це може працювати. Чи можете ви просіть це?
Я розумію :wчастину, вона записує поточний буфер на диск, припускаючи, що з ним вже є ім'я файлу, правда?
Я також розумію, !що виконує sudo teeкоманду і %представляє поточний вміст буфера правильно?
Але досі не розумію, як це працює.

Відповіді:


30

Структура :w !cmdозначає "записати поточний буфер, прокладений через команду". Так ви можете зробити, наприклад, :w !catі він пропустить буфер наскрізь cat.

Тепер %це ім'я файлу , пов'язаний з буфером

Так :w !sudo tee %буде передаватися вміст буфера наскрізь sudo tee FILENAME. Це ефективно записує вміст буфера в файл.


А що таке tee?
CodyBugstein

7

% представляє ім'я файлу поточного буфера, а не його вміст.

таке :w !sudo tee %засіб труби поточного буфера в sudo tee [currentfilename].

tee запускається як root, тому має доступ для запису, щоб зберегти свій stdin у файл.

Дивіться також /programming/2600783/how-does-the-vim-write-with-sudo-trick-work


2

Не зовсім правильно!

!commandзапускає команду як фільтр , який отримує текст stdin, щось робить і виводить до stdout.

При використанні w, ви штовхнув вміст файлу stdinз sudo tee %. %- це спеціальний регістр vim, який містить ім'я поточного файлу.

Отже, ви отримали sudo tee FILENAME, що підштовхне tee stdin- вміст файлу - до поточного файлу.


2
:!commandє фільтром (пор. :h !), а :w !commandні, він просто виконується commandз поточним файлом як stdin(пор. :h :w_c). На розум: :w !sed /./dне змінює вміст поточного буфера. Але рецепт дійсно не зовсім вірно і з іншої причини, %потрібно екранувати: :exec 'w !sudo tee ' . shellescape(expand('%', 1)). Оригінальна команда не працює, скажімо, з назви файлів з пробілами.
Satō Katsura
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.