Banyak dari Anda mungkin telah melihat perintah yang memungkinkan Anda untuk menulis pada file yang memerlukan izin root, bahkan ketika Anda lupa untuk membuka vim dengan sudo:
:w !sudo tee %
Masalahnya adalah saya tidak mengerti apa yang sebenarnya terjadi di sini.
Saya sudah memikirkan ini:
wuntuk ini
*: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 |:!|.
sehingga melewati semua baris sebagai input standar.
Bagian ini !sudo teememanggil teedengan hak administrator.
Agar semua masuk akal, %harus menampilkan nama file (sebagai parameter untuk tee), tetapi saya tidak dapat menemukan referensi tentang bantuan untuk perilaku ini.
tl; dr Bisakah seseorang membantu saya membedah perintah ini?
sudoditerapkan ke cat, tetapi tidak untuk >, jadi itu tidak diperbolehkan. Anda dapat mencoba menjalankan seluruh perintah dalam sebuah subkulit sudo, seperti :w !sudo sh -c "cat % > yams.txt", tetapi itu tidak akan berhasil, karena dalam subkulit, %adalah nihil; Anda akan mengosongkan isi file Anda.
:w !sudo sh -c "cat >%"benar-benar berfungsi dengan baik sudo tee %karena Vim mengganti nama file %sebelum ia sampai ke subkulit. Namun, tak satu pun dari mereka bekerja jika nama file memiliki spasi di dalamnya; Anda harus melakukan :w !sudo sh -c "cat >'%'"atau :w !sudo tee "%"memperbaikinya.
:w !sudo cat > %bekerja juga, dan tidak mencemari output standar?