有时我会在/etc
使用Vim时开始编辑配置文件,但忘记了使用它sudo
来启动Vim。不可避免的结果是,在完成编辑后,我遇到了可怕的通知,即我无权保存文件。
大多数情况下,编辑量很小,以至于我退出Vim并再次以root身份进行整个操作。我当然可以保存到可以写入的位置,然后以root身份复制,但这也有些烦人。
但是我敢肯定,sudo
从Vim内部成为root或使用它的简便方法,而不必放弃所做的更改。如果该方法不依赖于sudo
为用户设置,那就更好了。
有时我会在/etc
使用Vim时开始编辑配置文件,但忘记了使用它sudo
来启动Vim。不可避免的结果是,在完成编辑后,我遇到了可怕的通知,即我无权保存文件。
大多数情况下,编辑量很小,以至于我退出Vim并再次以root身份进行整个操作。我当然可以保存到可以写入的位置,然后以root身份复制,但这也有些烦人。
但是我敢肯定,sudo
从Vim内部成为root或使用它的简便方法,而不必放弃所做的更改。如果该方法不依赖于sudo
为用户设置,那就更好了。
Answers:
sudo不能更改现有进程的有效用户,它总是创建具有提升特权的新进程,并且原始shell不受影响。这是UNIX设计的基础。我通常只是将文件保存到/ tmp作为解决方法。如果您真的想直接保存它,则可以尝试使用Vim的功能,该功能可以将文件通过管道传输到另一个进程。尝试使用以下命令进行保存:
:w !sudo dd of=%
经过测试和工作。然后,Vim会要求您重新加载文件,但这是不必要的:您只需按o以避免重新加载并丢失撤消历史记录。您甚至可以将其保存到Vim命令/函数,甚至将其绑定到键以方便访问,但我将其作为练习留给读者。
%
,在vim中它将是您当前正在编辑的文件的路径。
%
文件名包含空格,则应将引号引起来。
'modified'
设置;您可以使用手动进行操作set nomodified
。
exec 'w !sudo dd of=' . shellescape(expand('%'))
在文件名包含引号,反斜杠,美元符号等的情况下进行处理
你可以把它放在你的 .vimrc
cmap w!! %!sudo tee > /dev/null %
您可以通过触发它:w!!
-它会将文件推sudo tee
送到当前文件名(%
)。
来自https://stackoverflow.com/questions/95072/what-are-your-favorite-vim-tricks
!sudo sponge %
改用。
sudoedit
而不是vim
进行所有管理员编辑的习惯。这是永远不会遇到此问题的一种方法:)。+1为Gilles的答案。