@SiberiaBear
2016-03-30T20:31:36.000000Z
字数 779
阅读 4054
vi/vim
我时常遇到这样的问题,想修改一个系统文件,找到该文件后,忘记该文件是对当前普通用户是只读文件,用vi打开后,进行了大批量的修改,但最后准备保存退出时,vi才提示,这是一个只读文件,无法保存。这个时候,可以用这样一个办法来保存。
由于我们通过vi打开的文件内容只是一个缓冲区内容,所以可以修改,但修改的是缓存,当使用:w
来保存时,vi才将缓存区的内容写入到文件中,所以只读提醒是最后保存是才出现的。
:w !sudo tee % > /dev/null
这样一个命令可以实现功能,原理是:
!
调用一个外部命令:sudo tee % > /dev/null
,接在w
后边的意思是,如果在vi中单独使用:w
意为将缓存区的内容存入当前文件,如果后边接其他路径文件,就是另存为到那个路径文件中,这里后边接了这样一个命令,是将当前缓存区的内容作为输入输入到后边这个命令(也可以说是程序)中。tee
是一个将内容输出到指定位置的命令,可以通过该命令读取内容并重定向输出到另一个地方,可以是文件,也可以是标准输出。%
会展开当前文件的完整路径,在这里就会展开成我们打开的这个文件的路径。sudo
之所以用,是因为tee这个命令会将它接到的内容重定向到一个文件中保存起来,同时显示到标准输出。而我们要写入的文件是一个对当前用户只读的文件,所以要切换到root用户来操作,就可以写入了。/dev/null
是一个空设备,这个意思是,tee命令会将当前的数据保存之后显示在标准输出上,但是我们并不需要把文件再重新显示一遍,所以这里是一个重定向,将这个输出定向到一个空设备中。注意可能需要要求输入root密码,同时会弹出提示,当前文件已经被更改,选择更新文件就好。