`: w! sudo tee %`는 어떻게 작동합니까


27

vim에 쓸 수있는 권한이없는 파일을 연 경우 변경해야한다고 결정하면 vim을 종료하지 않고 변경 내용을 작성할 :w !sudo tee %
수 있습니다.이 방법을 이해할 수 없습니다. 당신은 이것을 해부 할 수 있습니까?
나는 그 :w부분과 이미 관련된 파일 이름이 있다고 가정하고 현재 버퍼를 디스크에 씁니다.
또한 명령 !을 실행 하고 현재 버퍼 내용을 나타내는 것을 이해 합니까? 그러나 여전히 이것이 어떻게 작동하는지 이해하지 못합니다.sudo tee%

답변:


30

구조 :w !cmd는 " 명령을 통해 파이프 된 현재 버퍼 작성"을 의미 합니다. 예를 들어 :w !cat버퍼를 통해 파이프합니다 cat.

지금 %은 IS 파일명 버퍼와 관련이

따라서 :w !sudo tee %버퍼의 내용을 통해 파이프합니다 sudo tee FILENAME. 이것은 버퍼의 내용을 효과적으로 파일에 기록합니다.



2

별로야!

!command에서 명령을 필터 명령으로 실행하여 에서 텍스트를 가져 와서 stdin무언가를 수행하고에 출력합니다 stdout.

를 사용하여 w파일 내용을 stdin의 (으)로 푸시했습니다 sudo tee %. %vim의 특수 레지스터이며 현재 파일의 이름을 보유합니다.

따라서 파일 내용을 현재 파일로 sudo tee FILENAME푸시 tee stdin합니다.


2
:!command는 필터 (cf. :h !)이지만 :w !command그렇지 않은 command경우 현재 파일을 stdin(cf. :h :w_c) 로 실행 합니다 . 재치 : :w !sed /./d현재 버퍼의 내용을 변경하지 않습니다. 그러나 레시피는 실제로 다른 이유로 적절하지 않으므로 %탈출해야합니다 :exec 'w !sudo tee ' . shellescape(expand('%', 1)). 원래 명령은 공백이있는 파일 이름과는 작동하지 않습니다.
Satō Katsura
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.