Если вы откроете файл, на который у вас нет разрешения на запись в vim, то решите, что вам нужно его изменить, вы можете записать свои изменения, не выходя из vim, выполнив « :w !sudo tee %
Я не понимаю, как это может работать». Не могли бы вы проанализировать это?
Я понимаю :w
часть, он записывает текущий буфер на диск, предполагая, что с ним уже связано имя файла, верно?
Я также понимаю, !
что выполняет sudo tee
команду и %
представляет текущее содержимое буфера правильно?
Но все еще не понимаю, как это работает.
27
tee
?%
представляет имя файла текущего буфера, а не его содержимое.значит
:w !sudo tee %
означает передать текущий буфер вsudo tee [currentfilename]
.tee
запускается от имени пользователя root, поэтому имеет право на запись для сохранения своего стандартного файла в файл.Смотрите также /programming/2600783/how-does-the-vim-write-with-sudo-trick-work
источник
Не совсем верно!
!command
запускает команду как команду фильтра , которая получает текстstdin
, что-то делает и выводит вstdout
.Используя
w
, вы передали содержимое файла вstdin
офsudo tee %
.%
это специальный регистр в vim, который содержит имя текущего файла.Таким образом, вы получили
sudo tee FILENAME
, что подтолкнетtee
stdin
- файл содержимого - в текущий файл.источник
:!command
это фильтр (ср.:h !
), а:w !command
нет, он просто выполняетсяcommand
с текущим файлом какstdin
(ср.:h :w_c
). То есть::w !sed /./d
не меняет содержимое текущего буфера. Но рецепт действительно не совсем верный по другой причине, его%
нужно избегать:exec 'w !sudo tee ' . shellescape(expand('%', 1))
. Исходная команда не работает, скажем, с именами файлов с пробелами.