標籤: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,作完這個練習就把檔案改回去吧。
使用vim儲存沒有編輯許可權的檔案