使用vim保存没有编辑权限的文件

使用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,作完这个练习就把文件改回去吧。 





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值