3 回答

TA貢獻1712條經驗 獲得超3個贊
在:w !sudo tee %...
% 表示“當前文件”
正如eugene y所指出的,%確實的意思是“當前文件名”,將其傳遞給tee它,以便它知道要覆蓋哪個文件。
(在替換命令,這是略有不同;如:help :%所示,它是equal to 1,$ (the entire file)(感謝@Orafu的指出,這并不評估為文件名)。例如,。:%s/foo/bar意思是“ 在當前文件,替換的出現foo與bar”如果你亮點鍵入一些文本之前:s,您會看到突出顯示的行取代了%您的替換范圍。)
:w 沒有更新您的文件
此技巧的一個令人困惑的部分是,您可能會認為:w正在修改文件,但事實并非如此。如果您打開并修改了file1.txt,然后運行:w file2.txt,那將是“另存為”;file1.txt不會被修改,但是當前緩沖區的內容將發送到file2.txt。
相反file2.txt,您可以替代shell命令來接收緩沖區內容。例如,:w !cat將僅顯示內容。
如果Vim不是使用sudo訪問運行的,則它:w不能修改受保護的文件,但是如果將緩沖區內容傳遞給shell,則可以使用sudo運行shell 中的命令。在這種情況下,我們使用tee。
理解三通
至于tee,tee在正常的bash管道情況下,將命令描述為T形管道:它將輸出定向到指定的文件,并將其發送到標準輸出,該命令可以由下一個管道命令捕獲。
例如,在中ps -ax | tee processes.txt | grep 'foo',進程列表將被寫入文本文件并傳遞給grep。
+-----------+ tee +------------+
| | -------- | |
| ps -ax | -------- | grep 'foo' |
| | || | |
+-----------+ || +------------+
||
+---------------+
| |
| processes.txt |
| |
+---------------+
(使用Asciiflow創建的圖。)
有關更多信息,請參見tee手冊頁。
發球臺
在您的問題描述的情況下,使用teehack是因為我們忽略了它所做的一半。sudo tee寫入文件,還將緩沖區內容發送到標準輸出,但是我們忽略標準輸出。在這種情況下,我們不需要將任何內容傳遞給另一個管道命令。我們只是將其tee用作寫入文件的另一種方式,因此可以使用來調用它sudo。
使這個技巧變得容易
您可以將其添加到您的工具中.vimrc以使其易于使用:只需鍵入:w!!。
" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %
該> /dev/null部分顯式丟棄了標準輸出,因為正如我所說,因為我們不需要將任何內容傳遞給另一個管道命令。

TA貢獻1829條經驗 獲得超13個贊
在執行的命令行中,%代表當前文件名。記錄在:help cmdline-special:
In Ex commands, at places where a file name can be used, the following
characters have a special meaning.
% Is replaced with the current file name.
如您所知:w !cmd,將當前緩沖區的內容傳遞給另一個命令。是什么tee做的是標準輸入復制到一個或多個文件,也到標準輸出。因此,在成為root的同時:w !sudo tee % > /dev/null有效地將當前緩沖區的內容寫入當前文件??梢杂糜诖四康牡牧硪粋€命令是:dd
:w !sudo dd of=% > /dev/null
作為快捷方式,您可以將此映射添加到您的.vimrc:
" Force saving files that require root permission
cnoremap w!! w !sudo tee > /dev/null %
通過上面的命令,您可以鍵入:w!!<Enter>將文件另存為root。
- 3 回答
- 0 關注
- 895 瀏覽
添加回答
舉報