web-dev-qa-db-ja.com

`:w!Sudo tee%`はどのように機能しますか

Vimで書き込み権限のないファイルを開いた場合、そのファイルを変更する必要があると判断したら、:w !Sudo tee %を実行して、vimを終了せずに変更を書き込むことができます。
これがどのように機能するかわかりません。これを解剖していただけませんか?
私は:wの部分を理解しています。関連付けられているファイル名がすでにあると想定して、現在のバッファをディスクに書き込みますよね?
私は!コマンドを実行するSudo teeも理解しており、%は現在のバッファコンテンツを表しますか?
しかし、これがどのように機能するかはまだわかりません。

27
Ali

構造:w !cmdは、「現在のバッファに書き込むパイプコマンドで」を意味します。したがって、たとえば:w !catを実行すると、catを介してバッファがパイプ処理されます。

%は、バッファに関連付けられたfilenameです。

したがって、:w !Sudo tee %は、Sudo tee FILENAMEを介してバッファの内容をパイプします。これにより、バッファの内容がファイルに効率的に書き込まれます。

32
Stephen Harris

%は、現在のバッファのファイル名ではなく、ファイル名を表します。

したがって、:w !Sudo tee %は、現在のバッファをSudo tee [currentfilename]にパイプすることを意味します。

teeはrootとして実行されているため、stdinをファイルに保存するための書き込みアクセス権があります。

参照 https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-Sudo-trick-work

7
cas

不正解です。

!commandは、コマンドを filter コマンドとして実行します。このコマンドは、stdinからテキストを取得し、何かを実行してstdoutに出力します。

wを使用して、ファイルコンテンツをSudo tee %stdinにプッシュしました。 %はvimの特殊レジスターであり、現在のファイルの名前を保持します。

これでSudo tee FILENAMEが得られ、teestdin-ファイルの内容-現在のファイルにプッシュされます。

2
cuonglm