Linux进行vi编译代码出现“E45: ‘readonly‘ option is set (add ! to ove

[复制链接]
发表于 2026-10-5 18:42:12 来自手机 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
用 vi(或 vim)编辑文件时,按 :wq 保存突然弹出一行报错:E45: 'readonly' option is set (add ! to override),意思是"这个缓冲区是只读的,想强行覆盖就加个感叹号"。这行提示后面往往还跟着一句"你不是这个文件的所有者,或者文件权限不够"。本文把这条报错的几种成因和对应解决办法按场景列清楚,并顺带讲一个常一起出现的 Swapfile ".xx.swp" already exists 提示。

一、报错原文长什么样

典型的三行提示如下:

E45: 'readonly' option is set (add ! to override)

以及另一种:

Swapfile ".application.properties.swp" already exists!
Open Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:

前一个说的是"不能写",后一个说的是"上次编辑没正常退出,交换文件还留着"。两者经常同时出现,但成因不同,要分开处理。

二、成因之一:文件权限里没有写权限

先看清楚权限位。以 C++ 源文件举例:

ls -l test_openssl.cpp

输出一般有九位权限,分成三组:文件所有者、同组用户、其他用户。比如 -rw-r--r--,表示所有者只有读写,同组只读,其他用户也只读。如果你当前账号既不是所有者也不在同组组里,那自然只能读不能写,保存时就会触发 E45。

判断方法:whoami 看当前用户,ls -l 看所有者,两者不一致就是权限问题。

三、成因之二:当前账号不是文件所有者

如果这个文件是 root 或者某个服务账号创建的(配置文件、日志日志文件尤其常见),普通用户改它就是没有权限。两种正规解法:

  1. 用 sudo vi 文件名 以管理员身份打开,保存时输入当前用户密码即可;
  2. 或者联系文件所有者/运维把账号加入对应用户组。

补充一个常用权限位说明:chmod 755 文件名 表示所有者读写执行、同组与其他用户只读执行(拥有执行权限但通常无写权限),是脚本和可执行程序的常见设置;chmod 644 文件名 则是所有者读写、其余只读,普通配置文件的常见设置。改权限的时候按实际用途选,别无脑 777。

四、成因之三:文件正被别的操作占用

如果这个配置文件还在被程序使用(比如 Spring Boot 进程持有 application.properties,或者上一个 vi 窗口没关干净),也可能出现写不进去的情况。处理办法是先关掉占用它的进程或窗口,再重新打开编辑。

判断占用可以用 lsof 文件名,列出还打开着这个文件的进程,按实际情况决定是否重启服务。

五、不退出 vi 的临时解法

已经改了不少内容、不想重来一遍的时候,可以在 vi 内部直接关掉只读选项,然后正常保存:

:set noreadonly

按下 Esc 确保进入命令模式,然后输入上面这条,回车,再 :wq 保存退出。这个操作只是临时取消本次会话的只读限制,不会把文件改成可写状态,其他用户依然不能改,属于安全范围内的应急手段。

如果确实只是想覆盖保存、并且你清楚自己在做什么,:wq! 也能过,但不建议在有其他人在改同一文件时用,容易把别人的改动冲掉。

六、Swapfile ".xx.swp" already exists 怎么处理

vi 编辑时会生成一个隐藏的交换文件,比如编辑 application.properties 就会产生 .application.properties.swp。上一次编辑异常中断(断网、杀进程、强制关机)时这个文件会残留,下次打开就弹这个提示。四个选项的含义:

  • (O)pen Read-Only:只读打开,看得到内容但不能改;
  • (E)dit anyway:忽略残留交换文件直接编辑,风险是另一个 vi 还在改,两边的改动会互相覆盖;
  • (R)ecover:从交换文件里恢复上次未保存的内容,这是想找回丢失修改时首选的;
  • (Q)uit:退出,什么也不做;(A)bort 同上。

确认上一个 vi 已经彻底关掉后,最简单的是 (Q)uit 退出,删掉残留交换文件再重新打开:

rm -f .application.properties.swp

如果是想救回上次没存的内容,就选 (R),恢复成功后先 :w 存盘,再处理旧交换文件。

七、一句话总结

E45 的本质是"当前会话认为这个文件不该被你写",先 ls -l 看权限,非 root 就 sudo vi 或 chmod 补权限,临时应急用 :set noreadonly 再 :wq;遇到 .swp 残留先判断是"想恢复"还是"要清理",选 (R) 还是删文件,别直接 (E) 盲改。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表