3 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個贊
在:w !sudo tee %...
% 表示“當(dāng)前文件”
正如eugene y所指出的,%確實(shí)的意思是“當(dāng)前文件名”,將其傳遞給tee它,以便它知道要覆蓋哪個文件。
(在替換命令,這是略有不同;如:help :%所示,它是equal to 1,$ (the entire file)(感謝@Orafu的指出,這并不評估為文件名)。例如,。:%s/foo/bar意思是“ 在當(dāng)前文件,替換的出現(xiàn)foo與bar”如果你亮點(diǎn)鍵入一些文本之前:s,您會看到突出顯示的行取代了%您的替換范圍。)
:w 沒有更新您的文件
此技巧的一個令人困惑的部分是,您可能會認(rèn)為:w正在修改文件,但事實(shí)并非如此。如果您打開并修改了file1.txt,然后運(yùn)行:w file2.txt,那將是“另存為”;file1.txt不會被修改,但是當(dāng)前緩沖區(qū)的內(nèi)容將發(fā)送到file2.txt。
相反file2.txt,您可以替代shell命令來接收緩沖區(qū)內(nèi)容。例如,:w !cat將僅顯示內(nèi)容。
如果Vim不是使用sudo訪問運(yùn)行的,則它:w不能修改受保護(hù)的文件,但是如果將緩沖區(qū)內(nèi)容傳遞給shell,則可以使用sudo運(yùn)行shell 中的命令。在這種情況下,我們使用tee。
理解三通
至于tee,tee在正常的bash管道情況下,將命令描述為T形管道:它將輸出定向到指定的文件,并將其發(fā)送到標(biāo)準(zhǔn)輸出,該命令可以由下一個管道命令捕獲。
例如,在中ps -ax | tee processes.txt | grep 'foo',進(jìn)程列表將被寫入文本文件并傳遞給grep。
+-----------+ tee +------------+
| | -------- | |
| ps -ax | -------- | grep 'foo' |
| | || | |
+-----------+ || +------------+
||
+---------------+
| |
| processes.txt |
| |
+---------------+
(使用Asciiflow創(chuàng)建的圖。)
有關(guān)更多信息,請參見tee手冊頁。
發(fā)球臺
在您的問題描述的情況下,使用teehack是因?yàn)槲覀兒雎粤怂龅囊话?。sudo tee寫入文件,還將緩沖區(qū)內(nèi)容發(fā)送到標(biāo)準(zhǔn)輸出,但是我們忽略標(biāo)準(zhǔn)輸出。在這種情況下,我們不需要將任何內(nèi)容傳遞給另一個管道命令。我們只是將其tee用作寫入文件的另一種方式,因此可以使用來調(diào)用它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部分顯式丟棄了標(biāo)準(zhǔn)輸出,因?yàn)檎缥宜f,因?yàn)槲覀儾恍枰獙⑷魏蝺?nèi)容傳遞給另一個管道命令。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超13個贊
在執(zhí)行的命令行中,%代表當(dāng)前文件名。記錄在: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,將當(dāng)前緩沖區(qū)的內(nèi)容傳遞給另一個命令。是什么tee做的是標(biāo)準(zhǔn)輸入復(fù)制到一個或多個文件,也到標(biāo)準(zhǔn)輸出。因此,在成為root的同時:w !sudo tee % > /dev/null有效地將當(dāng)前緩沖區(qū)的內(nèi)容寫入當(dāng)前文件??梢杂糜诖四康牡牧硪粋€命令是: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 關(guān)注
- 894 瀏覽
添加回答
舉報(bào)