질문 : 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
'개발관련 > other' 카테고리의 다른 글
'yield return'의 적절한 사용법 (0) | 2022.01.17 |
---|---|
.NET Framework에서 Math.Pow ()를 구현하는 방법 (0) | 2022.01.17 |
Scala vs Groovy vs Clojure (0) | 2022.01.06 |
React / React Native에서 constructor와 getInitialState를 사용하는 것의 차이점 (0) | 2021.12.29 |
Bash에서 명령의 출력에 변수를 설정하는 방법 (0) | 2021.12.29 |