亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

vim“使用sudo編寫”技巧如何工作?

vim“使用sudo編寫”技巧如何工作?

心有法竹 2019-11-21 10:16:40
你們中許多人可能已經看到了允許您在需要root權限的文件上寫命令的命令,即使您忘記使用sudo打開vim時也是如此::w !sudo tee %問題是我不明白這里到底發生了什么。我已經想通了: w為此                                                        *:w_c* *:write_c*:[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 |:!|.因此它將所有行作為標準輸入傳遞。該!sudo tee零件tee具有管理員權限。為了使所有人都理解,%應該輸出文件名(作為的參數tee),但是我找不到關于此行為的幫助參考。tl; dr有人可以幫我剖析此命令嗎?VIM 須藤
查看完整描述

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部分顯式丟棄了標準輸出,因為正如我所說,因為我們不需要將任何內容傳遞給另一個管道命令。


查看完整回答
反對 回復 2019-11-21
?
烙印99

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。


查看完整回答
反對 回復 2019-11-21
  • 3 回答
  • 0 關注
  • 895 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號