天天看點

使用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,作完這個練習就把檔案改回去吧。