X

Vim 使用 tee 和 sudo 解決臨時權限不足的問題

Vim 在編輯檔案時,偶爾會遇到在編輯某個檔案,但是這檔案的權限不足,要怎麼做呢?

Vim 使用 tee 和 sudo 解決臨時權限不足的問題

一般遇到權限不足但是又已經寫完的情況,最常見的作法,就是寫到 /tmp 或自己家目錄,再將此檔案 mv 蓋回來。

不過 tee + sudo 可以不用離開 Vim 一次解決寫入的問題,命令詳見下述:(於 Vim 裡面)

  • :w !sudo tee %

環境準備 與 寫入測試

  1. $ mkdir /tmp/test # 先來準備一個權限不足的環境
  2. $ touch /tmp/test/test.txt
  3. $ sudo chown -R root.root /tmp/test
  4. 再來 使用 Vim 編輯 /tmp/test/test.txt
  5. vim /tmp/test/test.txt # 隨便打幾個字,再來 :w 要存檔,就會遇到下述訊息:
    • E45: 有設定 'readonly' 選項(唯讀) (可用 ! 強制執行)
  6. 訊息說用 ! 可以強制寫入看看,使用 :w! 遇到下述訊息:
    • "test.txt" E212: 無法以寫入模式開啟
  7. 再來嘗試看看 ":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 發覺有資料變更,需要重新載入檔案內容
Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post