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 是目前緩沖區。
緩沖區的操作: