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:
w
jest 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 tee
Część połączeń tee
z 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?
sudo
ma 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?