如果您在 vim 中打开一个无权写入的文件,然后决定需要更改它,您可以在不退出 vim 的情况下写入更改,方法是:w !sudo tee %
我不明白这是如何工作的。你能剖析一下这个吗?
我理解这:w
部分,它将当前缓冲区写入磁盘,假设已经有一个与之关联的文件名,对吗?
我也理解!
执行sudo tee
命令并%
代表当前缓冲区内容,对吗?
但还是不明白这是如何工作的。
答案1
结构:w !cmd
意思是“写入当前缓冲区管道式的例如,您可以这样做,:w !cat
它将通过管道传输缓冲区cat
。
现在%
是文件名与缓冲区关联
因此:w !sudo tee %
将通过管道传输缓冲区的内容sudo tee FILENAME
。这有效地将缓冲区的内容写入文件。
答案2
%
代表当前缓冲区的文件名,而不是其内容。
so:w !sudo tee %
表示将当前缓冲区通过管道传输到sudo tee [currentfilename]
.
tee
正在以 root 身份运行,因此具有写入权限以将其标准输入保存到文件中。
也可以看看https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work
答案3
不太对劲!
!command
运行命令作为筛选命令,它从 获取文本stdin
,执行某些操作并输出到stdout
。
通过使用w
,您将文件内容推送到stdin
of sudo tee %
。%
是vim中的特殊寄存器,保存当前文件的名称。
所以你得到了sudo tee FILENAME
,它将把tee
stdin
文件内容推送到当前文件。