sudoでvimを開くのを忘れた場合でも、root権限が必要なファイルに書き込むことができるコマンドは、おそらく多くの人が見たことがあるでしょう。
: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誰かがこのコマンドを分析するのを手伝ってくれませんか?
sudo
はに適用されますがには適用されcat
ないため>
、許可されません。コマンド全体をのようなsudoサブシェルで実行することもできますが:w !sudo sh -c "cat % > yams.txt"
、サブシェルで%
はnil であるため、これも機能しません。ファイルの内容を空白にします。
:w !sudo sh -c "cat >%"
、実際には同様に機能sudo tee %
します%
。ただし、ファイル名にスペースが含まれている場合、どちらも機能しません。あなたがするか、:w !sudo sh -c "cat >'%'"
それ:w !sudo tee "%"
を修正する必要があります。
:w !sudo cat > %
同様に機能せず、標準出力を汚染しませんか?