Wielu z was prawdopodobnie widziało polecenie, które pozwala pisać na pliku, który wymaga uprawnień roota, nawet jeśli zapomniałeś otworzyć vima za pomocą sudo:
:w !sudo tee %
Chodzi o to, że nie rozumiem, co dokładnie się tutaj dzieje.
Już to wymyśliłem:
wjest po to
*: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 |:!|.
więc przekazuje wszystkie linie jako standardowe wejście.
!sudo teeCzęść połączeń teez uprawnieniami administratora.
Aby wszystko miało sens, %powinna wypisać nazwę pliku (jako parametr dla tee), ale nie mogę znaleźć referencji w pomocy dla tego zachowania.
tl; dr Czy ktoś mógłby mi pomóc w rozwikłaniu tego polecenia?
sudoma zastosowanie do cat, ale nie do >, więc nie jest dozwolone. Możesz spróbować uruchomić całe polecenie w podpowłoce sudo, na przykład :w !sudo sh -c "cat % > yams.txt", ale to też nie zadziała, ponieważ w podpowłoce %jest zero; wyczyścisz zawartość swojego pliku.
:w !sudo sh -c "cat >%"faktycznie działa tak samo dobrze, sudo tee %ponieważ Vim zastępuje nazwę pliku, %zanim dotrze do podpowłoki. Jednak żadne z nich nie działa, jeśli nazwa pliku zawiera spacje; musisz to zrobić :w !sudo sh -c "cat >'%'"lub :w !sudo tee "%"to naprawić.
:w !sudo cat > %Nie działałby tak dobrze i nie zanieczyszczałby standardowego wyjścia?