Багато хто з вас, напевно, бачили команду, яка дозволяє писати у файл, який потребує кореневого дозволу, навіть коли ви забули відкрити 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 > %
вдалося б працювати і не забруднити стандартний вихід?