Многие из вас, вероятно, видели команду, которая позволяет вам писать в файле, для которого требуется разрешение root, даже если вы забыли открыть 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 > %
будет работать, а не загрязнять стандартный вывод?