[Vim]以sudo許可權來儲存vim開啟的readonly檔案
本文要說的命令如下:
:w ! sudo tee % > /dev/null
在做 linux 配置的時候,會改到只讀的檔案,比如 /etc/profile
$ ls -al /etc/profile
-rw-r–r– 1 root root 1139 Mar 14 17:30 /etc/profile
用 vim 打開該只檔案 /etc/profile 修改後,儲存會出錯:
:w
E45: ‘readonly’ option is set (add ! to override)
按提示在命令結尾加一個歎號,然後再次執行,還是出錯:
:w!
“/etc/profile” E212: Can’t open file for writing
用以下命令可以解決。此時,Vim會有兩次互動,
一,輸入密碼:
:w ! sudo tee % > /dev/null
[sudo] password for user:
二,警告檔案已被修改了,並顯示出一個選項菜單。
這裡按 L鍵重新將該檔案載入緩衝區。
Press ENTER or type command to continue
W12: Warning: File “/etc/profile” has changed and the buffer was changed in Vim as well
See “:help W12” for more info.
[O]K, (L)oad File:
該條命令如何工作:
查閱vim 的文檔(輸入:help :w),會提到 :write !{cmd}。
:[range]w[rite] [++opt] !{cmd}
Execute {cmd} with [range] lines as standard input
(note the space in front of the ‘!’). {cmd} is
executed like with “:!{cmd}”, any ‘!’ is replaced with
the previous command :!.
該命令會把緩衝區的內容作為標準輸入傳給指定的{cmd}, {cmd} 可以是任何外部的命令或程式。這裡調用了外部命令tee以sudo 許可權運行儲存。命令中符號 % 是vim 當中一個唯讀寄存器的名字,總儲存著當前編輯檔案的檔案路徑,這裡就會展開為當前檔案的完整路徑/etc/profile. 然後緩衝區的內容將當做標準輸入,覆蓋該編輯檔案的內容。vim 檢測到該檔案被一個外部程式修改,就會跳出提示選擇。然而這裡的檔案和緩衝區的內容是一致的。
這條命令怪模怪樣,卻經常用到。記在這裡,加深理解,也有助於記住此命令。