Vimで書き込み権限のないファイルを開いた場合、そのファイルを変更する必要があると判断したら、:w !Sudo tee %
を実行して、vimを終了せずに変更を書き込むことができます。
これがどのように機能するかわかりません。これを解剖していただけませんか?
私は:w
の部分を理解しています。関連付けられているファイル名がすでにあると想定して、現在のバッファをディスクに書き込みますよね?
私は!
コマンドを実行するSudo tee
も理解しており、%
は現在のバッファコンテンツを表しますか?
しかし、これがどのように機能するかはまだわかりません。
構造:w !cmd
は、「現在のバッファに書き込むパイプコマンドで」を意味します。したがって、たとえば:w !cat
を実行すると、cat
を介してバッファがパイプ処理されます。
%
は、バッファに関連付けられたfilenameです。
したがって、:w !Sudo tee %
は、Sudo tee FILENAME
を介してバッファの内容をパイプします。これにより、バッファの内容がファイルに効率的に書き込まれます。
%
は、現在のバッファのファイル名ではなく、ファイル名を表します。
したがって、:w !Sudo tee %
は、現在のバッファをSudo tee [currentfilename]
にパイプすることを意味します。
tee
はrootとして実行されているため、stdinをファイルに保存するための書き込みアクセス権があります。
参照 https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-Sudo-trick-work
不正解です。
!command
は、コマンドを filter コマンドとして実行します。このコマンドは、stdin
からテキストを取得し、何かを実行してstdout
に出力します。
w
を使用して、ファイルコンテンツをSudo tee %
のstdin
にプッシュしました。 %
はvimの特殊レジスターであり、現在のファイルの名前を保持します。
これでSudo tee FILENAME
が得られ、tee
stdin
-ファイルの内容-現在のファイルにプッシュされます。