我使用 vim 编辑文件。有时,我会忘记拥有适当的权限。我运行 vim 并将文件作为只读文件。我可以进行更改,但实际上无法写入更改。有时,我最终会打开一个文件并对其进行更改,意识到我没有在 sudo 中运行它,对自己尖叫,然后强制退出并以 root 用户身份再次打开它。
有解决方法吗?尽管文件处于只读状态,我是否可以强制更改文件?我至少可以保存更改,运行 diff 并将文件合并在一起吗?
答案1
根据您当前的问题,似乎有一些不同的方法:
- 只读通过 vi。如果你的文件有,
:set readonly
你可以- 使用
:w!
强制写入,或 - 问题
:set noreadonly
然后使用正常:w
- 使用
- A允许问题 (须藤):您无法写入但您有 sudo 权限。
- 问题:
:w !sudo tee %
。这会将缓冲区写入tee
,该命令接收管道信息并可以写入文件。由于 tee 以 sudo 权限运行,因此 tee 可以修改文件。
- 问题:
- A允许问题 (没有 sudo):您没有权限写入该文件,也没有管理员访问权限。
- 用来
:w! ~/tempfile.ext
将您的更改写入临时文件,然后采取措施将临时文件移动到目录(将临时文件发送给目录所有者/管理员)。
- 用来
你可以在这里读更多关于它的内容:
捷径
问题 #2 通常如此(允许问题,须藤),您可以到您的/etc/vim/vimrc
(或~/.vimrc
)以下快捷方式:
cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
然后您只需输入即可:w!!
保存须藤权力。我不会在这里解释,但上面的参考资料涵盖了许多捷径。
答案2
我能想到两种方法来做到这一点。
第一种方法假设您拥有该文件,但该文件是只读的。
只需将 vi 的感叹号后缀添加到写入命令 (:w!) 即可强制覆盖您自己的 READONLY 文件。当然,这假设您有权限在当前文件夹中写入和执行。
:w!
将导致 vi 覆盖原始的 READONLY 文件。
第二种方法假设其他人拥有该文件,并且您想要保存对该文件的更改。
实现此目的的一种方法是将对原始文件所做的更改在 vi 中保存为 ed 脚本。稍后可以使用 ed 行编辑器在 vi 之外将此 ed 脚本应用于原始文件(或其他类似文件)。
将当前编辑会话保存为 ed 脚本的一种方法是将原始文件名和编辑的 vi 缓冲区作为标准输入传递给 diff 实用程序,并使用 --ed 命令行开关,即将差异显示为 ed 脚本。
因此,假设 vi 缓冲区已编辑,则执行以下操作
:.,$!diff --ed [original_file] -
这会将当前缓冲区 (.,$!) 中的所有行替换为 diff 生成的 ed 脚本 (diff --ed [original_file] -),这是将原始文件转换为当前缓冲区内容所必需的。然后,我们希望将此 ed 脚本保存到安全的地方,并将脚本应用于我们可以写入的原始文件的版本。因此,将脚本保存到可写位置,例如您的登录文件夹:
:w ~/my_ed_script
现在退出 vi,并使用此 ed 脚本获取无法保存的已编辑文件。以下是如何从 bash 命令行提示符“$”完成此操作:
$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file
用文字表达,此命令序列的作用是连接我们用 diff 生成的脚本,并将 ed 写入命令“w”回显到 ed 的标准输入。然后,Ed 将此脚本应用于原始文件的可写副本,并将修改后的缓冲区更改写回到文件中。
这是一种使用 vi、diff 和 ed 将 vi 中执行的工作保存到原来由其他人拥有的文件中的方法。
答案3
只是想解决没有文件写入权限的情况。
:!chmod +w %
:w!
在这期间,vim 会抱怨文件中的更改(因为标志更改)——显然可以安全地忽略它们
答案4
对于没有 sudo 权限的情况,另一种可能性是使用:w /somewhere/where/i/have/permissions/foo.txt
,然后按照以下方法稍后处理权限问题瑞安·福克斯。