Vim 在編輯檔案時,偶爾會遇到在編輯某個檔案,但是這檔案的權限不足,要怎麼做呢?
Vim 使用 tee 和 sudo 解決臨時權限不足的問題
一般遇到權限不足但是又已經寫完的情況,最常見的作法,就是寫到 /tmp 或自己家目錄,再將此檔案 mv 蓋回來。
不過 tee + sudo 可以不用離開 Vim 一次解決寫入的問題,命令詳見下述:(於 Vim 裡面)
- :w !sudo tee %
環境準備 與 寫入測試
- $ mkdir /tmp/test # 先來準備一個權限不足的環境
- $ touch /tmp/test/test.txt
- $ sudo chown -R root.root /tmp/test
- 再來 使用 Vim 編輯 /tmp/test/test.txt
- vim /tmp/test/test.txt # 隨便打幾個字,再來 :w 要存檔,就會遇到下述訊息:
- E45: 有設定 'readonly' 選項(唯讀) (可用 ! 強制執行)
- 訊息說用 ! 可以強制寫入看看,使用 :w! 遇到下述訊息:
- "test.txt" E212: 無法以寫入模式開啟
- 再來嘗試看看 ":w !sudo tee %",會寫入完成,然後看到下述訊息,按 L 重新載入即可
- W12: 警告: 檔案 "test.txt" 自上次讀入後已變動, 而且編輯中的緩衝區也更動了
- See ":help W12" for more info.
- 確定([O]), 載入檔案((L)):
「:w !sudo tee %」的功能分解
- :w:Vim 的標準檔案寫入
- !:執行外部命令
- sudo:權限提昇
- tee:把 stdin 存到文件的程式
- %:Vim 的暫存器,存目前編輯文件的路徑名稱,可以 :echo @% 查看,更多資訊可見下面:
- :echo @% " directory/name of file
- :echo expand('%:t') " name of file ('tail')
- :echo expand('%:p') " full path
- :echo expand('%:p:h') " directory containing file ('head')
- 此命令就等同由外部 sudo 再使用 tee 將 stdin 寫入檔案,所以檔案變更,Vim 發覺有資料變更,需要重新載入檔案內容