vim 的 :w !sudo tee %
命令
:w !sudo tee %
假如我们修改如下文件

改了很久,最后保存的时候发现如下提示:
vim保存正在编辑的文件而提示权限不足,这种会很崩溃。
难道我还要重新修改一遍?
其实我们可以使用如下命令。来达到我们的目的。
:w !sudo tee %
即使用 vim 普通用户打开的文件, 可以用 sudo 来实现 root 权限的写入。
-
这条命令的含义是把当前编辑的文件的内容当做标准输入输入到命令:w !sudo tee %
里去sudo tee 文件名
- vim 命令:w !{cmd},让vim执行一个外部命令 {cmd},然后把当前缓冲区的内容从 stdin 传入外部命令{cmd}。
- 外部命令就是一个 Linux 的 shell 命令
- Linux tee 命令用于读取标准输入的数据,并将其内容 输出成文件 和 标准输出。
- % 代表当前缓冲区
- 类似一个 Linux 管道 : stdin | tee file
- :w ! ------------------------ 缓冲区 -> stdin
- sudo tee % ------------ stdin -> 当前缓冲区
tee 指令会从标准输入 ( stdin 也就是 0 ) 设备读取数据,将其内容输出到标准输出 ( stdout 也就是 1) 设备,同时保存成文件。
语法
参数:
-a 或 --append 附加到既有文件的后面,而非覆盖它.
-i 或 --ignore-interrupts 忽略中断信号。
–help 在线帮助。
–version 显示版本信息。
- 实例
使用指令 “tee” 将用户输入的数据同时保存到文件 “file1” 和 “file2” 中,输入如下命令:
以上命令执行后,将提示用户输入需要保存到文件的数据,如下所示:
My Linux #提示用户输入数据
My Linux #输出数据,进行输出反馈
此时,可以分别打开文件 “file1” 和 “file2”,查看其内容是否均是 “My Linux” 即可判断指令 “tee” 是否执行成功。
缓冲区(Buffer)
缓冲区(Buffer)是一块内存区域,用于存储着正在编辑的文件。在保存缓冲区并退出时,内容也随之被写回原始文件。
:buffers 或 :ls 或 :files 显示缓冲区列表。
- 如下图所示: 上面是三个缓冲区。
vim 使用普通用户,保存 root 权限文件。
- 第一列:缓冲区编号, 可以在编辑该文件时以此代替文件名。
- 第二列:缓冲区类型标志字符。
- 第三列:文件名,从缓冲区写入到的文件的文件名。内存 => 磁盘。
- 第四列:上次退出或切换缓冲区时光标所在的行号.
- 可能的 缓冲区类型标志字符 如下(从左到右):
% 当前缓冲区 #:上一次的活动缓冲区 l: 被载入并显示在某窗口中的缓冲区 h :被载入但隐藏的缓冲区. = :只读的缓冲区 \- :不可编辑的缓冲区, 其中°modifiable°选项被关闭 \+ :有改动的缓冲区
上图中 2 是上一次的活动缓冲区, 3 是当前缓冲区。
缓冲区的操作: