개발관련/other

vim "write with sudo"의 작동 원리

Rateye 2022. 1. 6. 14:39
728x90
반응형
질문 : vim "write with sudo"트릭은 어떻게 작동합니까?

많은 사람들이 sudo로 vim을 여는 것을 잊었을 때에도 루트 권한이 필요한 파일에 쓸 수있는 명령을 보았을 것입니다.

: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 누군가이 명령을 분석하도록 도와 줄 수 있습니까?

답변

In :w !sudo tee % ...

"%" 현재 파일을 의미합니다.

eugene y가 지적했듯이 % 는 실제로 "현재 파일 이름"을 의미하며, 덮어 쓸 파일을 알 수 있도록 tee

(대체 명령에서는 약간 다릅니다. :help :% 있듯이 equal to 1,$ (the entire file) (파일 이름으로 평가되지 않음을 지적한 @Orafu에게 감사드립니다). 예를 들면 :%s/foo/bar 는 " 현재 파일 foo 발생을 bar 로 바꿉니다."를 의미 :s 를 입력하기 전에 일부 텍스트를 강조 표시하면 강조 표시된 줄이 대체 범위로 % 를 대신하는 것을 볼 수 있습니다.)

 

":w" 파일이 업데이트되지 않습니다.

이 트릭의 한 가지 혼란스러운 부분은 :w 가 파일을 수정하고 있다고 생각할 수 있지만 그렇지 않다는 것입니다. file1.txt 를 열고 수정 한 다음 :w file2.txt 를 실행하면 "다른 이름으로 저장"이됩니다. file1.txt 는 수정되지 않지만 현재 버퍼 내용은 file2.txt 로 전송됩니다.

file2.txt 대신 쉘 명령을 대체하여 버퍼 내용을 수신 할 수 있습니다. 예를 들어, :w !cat 은 내용 만 표시합니다.

Vim이 sudo 액세스로 실행되지 않은 경우 :w 는 보호 된 파일을 수정할 수 없지만 버퍼 내용을 셸로 전달하면 셸 의 명령을 sudo로 실행할 있습니다. 이 경우 tee 를 사용합니다.

 

tee 이해

tee tee 명령을 T 자 모양의 파이프로 상상합니다. 출력을 지정된 파일로 보내고 표준 출력으로도 보냅니다 . 다음 파이프 명령으로 캡처 할 수 있습니다.

예를 들어, ps -ax | tee processes.txt | grep 'foo' 프로세스 목록은 텍스트 파일에 기록에 전달됩니다 grep .

     +-----------+    tee     +------------+
     |           |  --------  |            |
     | ps -ax    |  --------  | grep 'foo' |
     |           |     ||     |            |
     +-----------+     ||     +------------+
                       ||   
               +---------------+
               |               |
               | processes.txt |
               |               |
               +---------------+

(Asciiflow로 만든 다이어그램.)

자세한 내용은 tee 맨 페이지 를 참조하십시오.

 

Tee as a hack

귀하의 질문이 설명하는 상황에서 tee 를 사용하는 것은 우리가하는 일의 절반을 무시하기 때문에 해킹 입니다. sudo tee 는 파일에 쓰고 버퍼 내용을 표준 출력으로 보내지 만 표준 출력을 무시합니다 . 이 경우 다른 파이프 명령에 아무것도 전달할 필요가 없습니다. 우리는 파일을 작성하는 다른 방법으로 tee sudo 호출 할 수 있습니다.

이 트릭을 쉽게 만들기

이 트릭을 사용하기 쉽게 만들기 위해 .vimrc 에 추가 할 수 있습니다 :w!! .

" Allow saving of files as sudo when I forgot to start vim using sudo.
cmap w!! w !sudo tee > /dev/null %

> /dev/null 부분은 명시 적으로 표준 출력을 버립니다. 제가 말했듯이 다른 파이프 명령에 아무것도 전달할 필요가 없기 때문입니다.

출처 : https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work
728x90
반응형