在vim编辑器中,你可能会遇到一个问题:你打开并编辑了一个文件,但在保存时才发现你没有必要的权限。这通常发生在你忘记使用sudo命令打开一个需要管理员权限的文件时。幸运的是,有一个简单的解决方案,那就是使用命令“:w !sudo tee %”。

这个命令的工作原理是这样的:在vim中,“%”代表当前编辑的文件名。":w !{cmd}“是一个vim命令,它会执行{cmd}命令,并将当前编辑的文件内容作为标准输入传入。在这个例子中,{cmd}是"sudo tee %”,这意味着它会以超级用户的权限将当前编辑的文件内容保存到当前文件中。

这个技巧在Debian和Ubuntu的用户中可能更常用,因为这些用户通常直接使用root用户,而不是使用sudo。他们可能会直接使用vim编辑/etc目录下的文件,然后在保存时才发现没有权限。一种解决方法是先保存到一个临时文件,然后退出vim,再使用sudo cp命令将临时文件复制回原来的位置。但实际上,你可以直接在vim中完成这个过程,只需使用":w !sudo tee %"命令即可。

总的来说,":w !sudo tee %"命令是一个非常有用的技巧,它可以帮助你在没有足够权限的情况下保存在vim中编辑的文件。


当你在Vim中执行:w !sudo tee %命令时,实际上发生了以下几个步骤:

  1. :w命令:这是Vim的写入(write)命令,它通常用于将当前缓冲区的内容保存到文件。但是,当w命令后面跟着一个!时,Vim会将当前缓冲区的内容写入到一个外部命令的标准输入,而不是写入到文件。这就是为什么这个命令可以在没有写入权限的情况下保存文件。

  2. !sudo tee %:这是一个外部命令,Vim会将当前缓冲区的内容写入到这个命令的标准输入。这个命令由两部分组成:

    • sudo:这是一个Unix命令,它允许用户以超级用户(root)的权限运行命令。在这个例子中,它使得tee命令可以以root的权限运行,从而可以写入到没有写入权限的文件。

    • tee %tee是一个Unix命令,它从标准输入读取数据,并将数据写入到一个或多个文件中。在这个例子中,%是一个Vim的特殊符号,代表当前编辑的文件名。所以,tee %命令会将从Vim传来的数据写入到当前编辑的文件中。

总的来说,:w !sudo tee %命令的工作原理是:Vim将当前缓冲区的内容写入到sudo tee %命令的标准输入,sudo tee %命令以root的权限将这些数据写入到当前编辑的文件中,从而实现了在没有写入权限的情况下保存文件。

05-30 07:57