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:
w
untuk 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 tee
memanggil tee
dengan 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?
sudo
diterapkan 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?