'!' 무슨 뜻인가요? ex 명령(:wq! | :w! | :q! )에 추가하면 실제로 어떤 작업이 수행되나요?

'!' 무슨 뜻인가요? ex 명령(:wq! | :w! | :q! )에 추가하면 실제로 어떤 작업이 수행되나요?

나는 이것이 무엇을 의미하는지 이해한다뭔가를 해보세요.

이렇게 하면 모드 $ vim -R file로 들어가는데 read-only예방 모드로만 사용됩니다.

-R  Readonly mode.  The 'readonly' option will be set for all the
    files being edited.  You can still edit the buffer, but will
    be prevented from accidentally overwriting a file.  If you
    forgot that you are in View mode and did make some changes,
    you can overwrite a file by adding an exclamation mark to
    the Ex command, as in ":w!".  The 'readonly' option can be
    reset with ":set noro" (see the options chapter, |options|).
    Subsequent edits will not be done in readonly mode.  Calling
    the executable "view" has the same effect as the -R argument.
    The 'updatecount' option will be set to 10000, meaning that
    the swap file will not be updated automatically very often.

그러나 내가 아직도 이해하지 못하는 것은 root파일의 소유자가 사용자인 경우에도 권한을 건너뛰라는 지침을 발행하고 소유자와 그룹을 변경하는 이유입니다.

답변1

!일반적으로 "force"에서 기대하는 것을 의미하지만 특정 명령에 대한 의미는 명령에 따라 다릅니다. w!어떤 이유로든 Vim이 파일에 쓸 수 없는 경우 , Vim은 현재 버퍼의 내용을 사용하여 새 파일을 삭제하고 생성하려고 시도합니다.

다음 예를 고려하십시오(inode 번호 관찰).

$ touch foo
$ chmod -w foo
$ stat foo
  File: ‘foo’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 22h/34d Inode: 10396141    Links: 1
Access: (0444/-r--r--r--)  Uid: ( 1000/ muru)   Gid: ( 1000/ muru)
Access: 2015-09-10 00:24:28.259290486 +0530
Modify: 2015-09-10 00:24:28.259290486 +0530
Change: 2015-09-10 00:24:30.771263735 +0530
 Birth: -
$ vim -c 'r!date' -c 'wq!' foo
$ stat foo                    
  File: ‘foo’
  Size: 30          Blocks: 8          IO Block: 4096   regular file
Device: 22h/34d Inode: 10396151    Links: 1
Access: (0444/-r--r--r--)  Uid: ( 1000/ muru)   Gid: ( 1000/ muru)
Access: 2015-09-10 00:24:37.727189657 +0530
Modify: 2015-09-10 00:24:37.731189614 +0530
Change: 2015-09-10 00:24:37.763189273 +0530
 Birth: -
$ cat foo
Thu Sep 10 00:24:37 IST 2015

그래서 주인과 그룹이 바뀌는 거죠. 권한이 예약되었습니다 -:h write-permissions:

                                                    write-permissions
When writing a new file the permissions are read-write.  For unix the mask is
0666 with additionally umask applied.  When writing a file that was read Vim
will preserve the permissions, but clear the s-bit.

Vim이 쓰기를 거부하도록 하려면 다음을 참조하세요 :h write-readonly.

                                                    write-readonly
When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a
readonly file.  When 'W' is not present, ":w!" will overwrite a readonly file,
if the system allows it (the directory must be writable).

"디렉토리는 쓰기 가능해야 합니다"라고 적혀 있습니다. 쓰기 가능한 디렉토리가 없으면 Vim은 파일을 삭제하거나 새 파일을 생성할 수 없기 때문입니다.

답변2

vim(1)에서 언급했듯이 -R파일이 다음과 같지 않은지 확인하십시오.우연한사용자가 맹목적으로 말할 때 덮어쓰지만 :w쓰기 사용을 비활성화하지는 않습니다 :w!.

그러나 이는 단지 응용 프로그램일 뿐이며 실제로 파일로 작업을 수행해야 할 때가 오면 운영 체제 커널은 어쨌든 권한을 확인합니다. 실험: 나는 달렸다

strace vim /etc/hostname 2>vim.out

한 명의 사용자 아래에서. 명시적인 지침이 없더라도 -R권한을 확인하기 때문에 읽기 전용으로 시작됩니다. 버퍼를 변경한 후

W10: Warning: Changing a readonly file

나타났다.

이제 :w내가 얻었어

E45: 'readonly' option is set (add ! to override)

나는 조언을 받아들였고,

"/etc/hostname" E212: Can't open file for writing

예상대로 vim.out우리는 다음을 볼 수 있습니다:

open("/etc/hostname", O_WRONLY|O_CREAT|O_TRUNC, 0644) = -1 EACCES (Permission denied)

답변3

FORCE, :w의 경우 -R이 설정되지 않은 경우에도 "시스템 권한"을 의미하고 :q의 경우 unsaved작업 손실을 의미합니다.

관련 정보