vim忘带sudo保存
在 Vim 里改完文件,发现忘了 sudo 怎么办?
E45: 'readonly' option is set (add ! to override)
这条帖子有两万多浏览,说明戳中了不少人。这种感觉确实很熟悉——你对着某个系统配置文件改了半天,手指准备按下 :wq,结果 Vim 冷冷地告诉你:没权限,只读,保存失败。
改动全没了?不对,缓冲区里还在。文件没变?对,磁盘上一个字没动。
那怎么办?
一、救命的一行命令
帖子下面,发现是K8S群里的一个大佬回复了:
哈哈,这个情况不需要无力,只需要 :w !sudo tee % 就可以了,我一直有在我的 vim 配置中加一个 alias,直接 :w!! 就用 sudo 写了。
这个命令乍一看有点奇怪,拆开来看就清楚了:
:w !sudo tee %
:w !外部命令:Vim 的写入指令,后面跟感叹号时,不是写入文件,而是把当前缓冲区内容作为标准输入传给后面那个命令
sudo:赋予 root 权限
tee:读取标准输入,写入指定文件,同时在终端打印一遍
%:Vim 的占位符,自动展开为当前正在编辑的文件路径
整个流程是:Vim 把你改好的内容通过管道传给 sudo tee,后者以 root 权限把内容写进原文件。磁盘上的文件就这么更新了。
如果不想看到 tee 在终端打印出来的一整屏内容,加个重定向丢掉:
:w !sudo tee % > /dev/null
二、执行完之后还有一点小尾巴
命令跑完,文件是保存了,但 Vim 不会静悄悄地继续——它会弹出一个提示:
W12: Warning: File "/etc/xxx.cnf" has changed and the buffer was changed in Vim as well See ":help W12" for more info. [O]K, (L)oad File:
意思是磁盘上的文件已经变了(刚才 tee 写进去的),但 Vim 的缓冲区还是老的,两边不一致,Vim 在问你怎么处理。
这里直接按 L 选择 Load File,Vim 就会把磁盘上的新内容重新载入,缓冲区和磁盘同步,之后正常 :q 退出就行。
如果当时手快按了 O 跳过,后面 :q 会提示有未保存修改,这时候要么再手动执行一次 :e! 重载,要么直接 :q! 强退——反正文件已经写进磁盘了,不用担心内容丢失。
顺便提一下,有人会想到用 :wq !sudo tee % 一步到位保存并退出,但这个写法在 Vim 里是不合法的,直接报错。:wq 不支持后面跟外部命令,保存和退出必须分两步来。
三、% 只是个占位符,可以换掉
说回 %,它并没有什么特殊的,只是"当前文件路径"的缩写。既然只是个占位符,完全可以把它换成任意路径,直接写到别的地方去:
" 提权写入到其他系统路径 :w !sudo tee /etc/nginx/nginx.conf
" 不需要提权,直接写到 /tmp :w !tee /tmp/test.txt
这里和 Vim 原生的 :w 路径 做个对比,两者都能另存为,实际使用时选哪个都行,但有一点差异值得知道:
:w ~/backup.conf:Vim 自己写入,以当前用户权限为准,写家目录、有权限的目录没问题
:w !tee ~/backup.conf:调用外部命令写入,可以按需叠加 sudo 提权,写系统目录时更灵活
需要 sudo 写系统文件就用 !tee 配合 sudo,只是普通另存为就直接 :w 路径 更简洁。
四、那个 alias 怎么配?
大佬提到在 vimrc 里配了 alias,忘带 sudo 时直接 :w!! 救场。在 ~/.vimrc 里加一行:
cnoreabbrev w!! w !sudo tee % > /dev/null
cnoreabbrev 是 Vim 的命令行缩写映射,在你输入完触发词并按回车时展开,比 cmap 更不容易和 Vim 内置命令冲突,是更推荐的写法。如果 ~/.vimrc 不存在就新建一个,写入后在 Vim 里执行 :source ~/.vimrc 立即生效,或者关掉重开也行。
以后再遇到只读文件,:w!! 回车,根据情况输入 sudo 密码或利用会话缓存自动通过,然后在 W12 提示里按 L 重载文件,最后 :q 退出。整套流程熟了之后几秒钟的事。
五、总结一下
场景 命令 忘带 sudo,救急保存当前文件 :w !sudo tee % 屏蔽终端输出 :w !sudo tee % > /dev/null 保存后处理 W12 提示 按 L 重载,然后 :q 配成快捷键 cnoreabbrev w!! w !sudo tee % > /dev/null 另存为到其他路径(需提权) :w !sudo tee /path/to/file 普通另存为(无需提权) :w ~/backup.conf
下次再碰到那行红色报错,不用慌,% 就是你当前的文件,tee 帮你写进去,sudo 给它开路。