Багато хто з вас, напевно, бачили команду, яка дозволяє писати у файл, який потребує кореневого дозволу, навіть коли ви забули відкрити vim з sudo:
: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", але це також не буде працювати, тому що в нижній частині %- нуль; ви очистите вміст свого файлу.
:w !sudo sh -c "cat >%"насправді працює так само добре, як sudo tee %Vim підміняє ім'я файлу, %перш ніж він коли-небудь потрапить до передплати. Однак жоден з них не працює, якщо ім'я файлу має пробіли; ви повинні це зробити :w !sudo sh -c "cat >'%'"або :w !sudo tee "%"виправити.
:w !sudo cat > %вдалося б працювати і не забруднити стандартний вихід?