「!」どういう意味ですか? 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

1人のユーザーの下で。明示的な指示がなくても-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損失を意味します。

関連情報