使用vim编辑文件非常方便,vim也是修改系统配置最常用的工具。但有时我们会顾着方便而忘了自己有没有权限编辑文件。 往往会在写完文件内容保存时才发现自己没有权限。怎么办? 将文件使用:w <newname>的方式另存为新文件,再用新文件替换就文件的虽然可行(还需要注意修改文件操作权限),但还是麻烦了点。下面将使用一条命令保存没有权限的文件。
先上命令:
:w !sudo tee % > /dev/null
这里“:”表示在vim的命令行模式下。注意 w 和!之间隔着一个空格。
下面首先介绍:w !<cmd>命令
:w !<cmd> 用于将当前缓冲区内容作为标准输入送给cmd命令。 比如 :w !sh 就是将缓冲区的每一行视为shell命令然后执行。为了便于理解,这里再介绍一个r命令。: r !<cmd>用于将<cmd>命令的执行结果读入到当前缓冲区。如:.r!date就是将当前时间写入到当前行(.)。
接下来是tee命令
博主初学unix时,感觉ls、cp等命令很容易发现就是对应单词的缩写。但tee命令很难理解,也很少用得到。 tee是这样工作的,将前一个命名的标准输出(即输出到屏幕)作为标准输入,然后再输出到标准输出,同时保存为对应文件。将这个流程画出来,刚好就是字母T,这应该就是RMS等人将该命令命名为tee的原因。
举个例子:
ls |tee out.txt
ls 将输出当前目录列表,这个输出被管道送入tee命令,tee将该输入内容直接输出的同时,备份到out.txt文件。
最后一个是sudo,这个用过*nix的都应该知道,就是以superviser执行命令。
预备知识就这么多,接下来我们看看本文开头的那条命名是如何工作的。
首先w !sudo tee 这一部分将缓冲区内容送给tee命令。sudo 确保tee命令是以supervisor来执行的,这样就能保证有写入权限。
现在tee 已经获得了我们的文件内容,接下来就要将内容另存为其他文件了。这里我们将文件保存为它自己。 输入%以代表文件路径名(%是vim中保存当前文件路径名的专用寄存器,在命令行下会自动替换为完整路径)。 到了这里我们实际就能借助tee命令保存文件内容了,但tee命令还有标准输出,为了避免重复显示,我们将其丢到黑洞,即/dev/null。
看完命令,我们实际执行以看效果。
执行vi /etc/hostname 。编辑之后执行:w!会弹出错误警告。这里我们使用开头的命令重新保存。 执行完命令后,vim会弹出内容已经改变的确认提示。注意这时,tee已经帮我们把文件内容写入原文件件了。 我们按O确认。然后像往常一样退出。这次我们在编辑文件时忘记了sudo,但确实成功修改了文件。 最后提醒一下,如果你不是真的想修改hostname,作完这个练习就把文件改回去吧。