在 Linux 下用 vim 编辑只读配置文件,保存时提示没有权限,需要退出编辑并使用 sudo 命令重新打开,比较麻烦,在网上冲浪无意间看到解决办法,记录如下。
似乎可以使用 :w!
保存,但这种方式会导致文件所有者和所属组变为当前用户。
这是因为 vim 在编辑文件时会创建一个属于当前用户(ubuntu)的 .swp
文件,使用 :w!
强制保存就相当于用临时文件覆盖掉了原文件,导致原文件的所属用户/所属组发生变化,这通常不符合预期。
正确的方式是执行如下命令
:w !sudo tee %
如上 vim 命令中 :w !cmd
的意思是将当前 buffer 中的数据通过 cmd 命令来处理,例如 :w !cat
命令就是将当前 buffer 的内容通过 cat
命令打印到终端。
%
号代表着当前文件的文件名,tee
命令用于显示程序的输出并将其复制到一个文件中,sudo
用于赋予 tee 命令权限,那么连起来的意思就是将 buffer 内容写入到当前文件中。
为了便于使用,可以将命令保存到 ~/.vimrc,后续使用 vim 强制保存文件时输入 :w!!
时会自动将命令补全。
cmap w!! w !sudo tee > /dev/null %
参考