假设您打开一个具有写入权限的文件。同时,您更改权限并删除写入权限,而您仍然在某些编辑器中打开文件。
如果编辑并保存会发生什么?
答案1
打开文件时会检查文件的权限。更改权限不会影响已打开该文件的进程可以使用该文件执行哪些操作。有时,这会与以附加权限启动、打开文件,然后删除这些附加权限的进程一起使用:它们仍然可以访问该文件,但可能无法重新打开它。
然而,编辑者通常不会保持文件打开。当编辑器打开文档时,幕后发生的事情是编辑器将文件内容加载到内存中并关闭文件。保存文档时,编辑器会打开文件并写入新内容。
编辑者在保存文件时可以遵循两种策略之一。他们可以创建一个新文件,然后将其移动到位。或者,他们可以打开现有文件并覆盖旧内容。覆盖的优点是文件的权限和所有权不会改变,并且即使在只读目录中也能工作。覆盖的主要缺点是,如果保存中途失败(编辑器崩溃、系统崩溃、磁盘已满……),您将得到一个被截断的文档。不同的编辑选择不同的策略;如果可能的话,好的人会先写入新的,然后移动,并且仅在只读目录中覆盖(在其他地方进行备份之后)。
如果编辑器遵循先新建后移动策略,则文件的权限并不重要:编辑器将创建一个新文件,并且只需要对此目录的写入权限。有两种例外:如果目录有粘性位,更改文件的所有权(但不是权限)可能会使进程无法将新文件移动到位。另一个例外是在支持删除权限的系统上ACL(例如 OSX):撤销文件的删除权限可能会导致移动无法进行。
如果编辑器遵循覆盖策略,撤销写入权限将导致无法保存。 (但是,某些默认情况下覆盖的编辑器可能会回退到先新建后移动。)
在 Vim 中,您可以通过关闭backupcopy
选项;也可以看看为什么当我们在“vi”编辑器中编辑时,inode 值会发生变化?。在 Emacs 中,您可以通过设置强制覆盖策略backup-by-copying
多变的到t
。
答案2
您可以进行所有您喜欢的编辑,但是当您尝试保存时,编辑器会抱怨该文件无法写入。如果您的编辑器创建了备份文件,则更改显然会保存到备份文件中。
根据您的编辑器,您也许可以覆盖它。例如,如果我是文件的所有者或通过输入命令(强制应用写入操作的方法),vim
我可以保存到不可写的文件。其他编辑器(例如)不允许您保存文件,而是为您提供一个选项。root
:w!
!
gedit
Save As...
更新
谢谢社会福利署的评论在下面,您应该注意,这种行为实际上是由于编辑器的设计方式造成的:它们使用临时文件(缓冲区)来保存所有编辑,直到您真正决定将缓冲区写入文件。