有时候打开文件编辑完了才发现没有权限写当前文件,退出重新编辑?不用!vim里面调用外部命令写时使用sudo就可以了。
:w 命令如果不提供参数,则将当前缓冲区写到当前编辑的文件内,但是如果提供参数,比如
:w new_file 则将当前缓冲区内容写到新文件new_file中,其实:w命令有很多种形式
更进一步
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
上面的命令形式,将range范围内的缓冲区作为标准输入调用cmd命令。
而tee命令读取标注输入,然后将其写到文件和标准输出中,在vim中%代表当前编辑缓冲区的文件名,从而有了下面的命令:
:w !sudo tee %
但tee命令还会向standard output输出内容,可以将其重定向到/dev/null
:w !sudo tee % > /dev/null
还可以利用cat命令来达到同样的目的:
:w !sudo sh -c "cat > %"
=== 我向星星许了个愿。我并不是真的相信它,但是反正也是免费的,而且也没有证据证明它不灵。 —— 加菲猫
转自:http://openwares.net/linux/sudo_vim_tea.html
===========另一篇写的更详细 ================
在使用Ubuntu时,有时编辑文件,可能没有权限,但是忘记sudo了,所以就想到是不是vi应该有编辑中提升权限的呀。
搜索了一下,果然有:
在vim中保存正在编辑的文件而不需要必要的权限。
(Save a file you edited in vim without the needed permissions)
下面我们就分析下这条命令是怎样做到保存文件而不需要必要的权限的
:w !sudo tee %
man vim就会发现
百分号(“%”)代表当前文件名
根据man vim的提示:
:[range]w[rite] !{cmd} Execute {cmd} with [range] lines as standard input
(note the space in front of the ‘!’). {cmd} is
executed like with “:!{cmd}”, any ‘!’ is replaced with
the previous command
“:w !sudo tee %”这条命令的含义是把当前编辑的文件的内容当做标准输入输入到命令sudo tee 文件名里去
也就是sudo保存为当前文件名
这个功能其实可能debian和ubuntu的用户更需要一些
今天刘洋同学问到一个问题,为什么sudo下面的命令还是无权限
$sudo echo ‘1′ > ip_forward
bash: ip_forward: Permission denied
而以root身份就可以?
# echo ‘1′ > ip_forward
一 开始没有看出原因来,后来仔细一琢磨,其实原因很简单,shell对‘>’解释干扰了对这个命令含义的判断。我们本想应该是这样的意思:让sudo 执行后面的这些“echo ‘1′ > ip_forward”,而实际上是:sudo echo ‘1′ ,执行到这里,shell再把它的执行结果重定向到ip_forward里去!当然是无权限,因为流本身不会随echo那样被sudo“感染”上suid 权限!
解决方法是什么?也很简单,就让后面那一串东西搁一起执行:
$sudo sh -c ‘echo 1 > ip_forward’
等等,还有没有更好的解决方法?有!刘洋同学认真思考了一下,觉得应该有这么个东西XX: echo ‘1′ | sudo XX ip_forward。我擦亮眼睛一看,我靠,这不就是tee(1)么!!没错,另一种解决方法就是:
$echo ‘1′ | sudo tee ip_forward
或者:
$echo ‘1′ | sudo tee ip_forward | cat > /dev/null
刘洋问tee(1)是不是和tea有关系?不是!tee其实取自大写字母T的发音,而T不正是最后一个命令中流的流向么?!多么形象的名字啊!