`:w!sudo tee%`の仕組み

`:w!sudo tee%`の仕組み

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

答え1

構造とは、:w !cmd「現在バッファへの書き込み」を意味します。管路たとえば、これにより:w !catバッファをパイプできますcat

%それはファイル名バッファに関連付けられている

したがって、:w !sudo tee %バッファの内容はパイプで接続されますsudo tee FILENAME。これにより、バッファの内容がファイルに効果的に書き込まれます。

答え2

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

so:w !sudo tee %は現在のバッファをsudo tee [currentfilename]

teeルートとして実行されているため、標準入力をファイルに保存する書き込み権限があります。

また、見ることができますhttps://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work

答え3

あまり正しくない!

!command次のようにコマンドを実行します。フィルターからテキストを取得するコマンドは、stdinいくつかの操作を実行してから出力しますstdout

を使用すると、wファイルの内容stdinsudo tee %%現在のファイルの名前を格納するvimの特殊レジスタです。

したがって、ファイルの内容を現在のファイルにプッシュしますsudo tee FILENAMEtee stdin

関連情報