linux vim readonly,[Vim]以sudo权限来保存vim打开的readonly文件

在Linux配置过程中,有时需要编辑只读文件如/etc/profile。当使用vim编辑并尝试保存时,会遇到权限问题。通过:w!sudotee%>/dev/null命令,可以解决这个问题。该命令利用sudo权限和tee命令将vim缓冲区的内容写入文件。执行时,需要输入密码,并在文件被外部程序修改的提示下选择加载文件。这一命令虽然复杂,但在处理只读文件时非常实用。
摘要由CSDN通过智能技术生成

本文要说的命令如下:

:w ! sudo tee % > /dev/null

在做 linux 配置的時候,会改到只讀的文件,比如 /etc/profile

$ ls -al /etc/profile

-rw-r–r– 1 root root 1139 Mar 14 17:30 /etc/profile

用 vim 打開該只文件 /etc/profile 修改后,保存會出錯:

:w

E45: ‘readonly’ option is set (add ! to override)

按提示在命令结尾加一个叹号,然后再次执行,还是出错:

:w!

“/etc/profile” E212: Can’t open file for writing

用以下命令可以解决。此时,Vim会有两次交互,

一,输入密码:

:w ! sudo tee % > /dev/null

[sudo] password for user:

二,警告文件已被修改了,并显示出一个选项菜单。

这里按 L键重新将该文件载入缓冲区。

Press ENTER or type command to continue

W12: Warning: File “/etc/profile” has changed and the buffer was changed in Vim as well

See “:help W12” for more info.

[O]K, (L)oad File:

该条命令如何工作:

查阅vim 的文档(输入:help :w),会提到 :write !{cmd}。

:[range]w[rite] [++opt] !{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 :!.

该命令会把缓冲区的内容作为标准输入传给指定的{cmd}, {cmd} 可以是任何外部的命令或程序。這裡調用了外部命令tee以sudo 权限运行保存。命令中符号 % 是vim 当中一个只读寄存器的名字,总保存着当前编辑文件的文件路径,这里就会展开为当前文件的完整路径/etc/profile. 然后缓冲区的内容将当做标准输入,覆盖该编辑文件的内容。vim 检测到该文件被一个外部程序修改,就会跳出提示选择。然而这里的文件和缓冲区的内容是一致的。

这条命令怪模怪样,却经常用到。记在这里,加深理解,也有助于记住此命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值