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