vimで読み取り専用モードをオーバーライドする方法は? [コピー]

vimで読み取り専用モードをオーバーライドする方法は? [コピー]

vimでファイルを編集して保存しようとした後、ファイルが読み取り専用として報告されることがよくあります。この問題に対する解決策はを追加することです!wq。 vimプログラムが内部的に読み取り専用ファイルに書き込むのに十分な権限を取得する方法を理解しようとしています。

切り替えられる内部フラグがあるか、またはvimはしばらくの間一時的に権限を取得しますか?

ベストアンサー1

Vimでこれを行うときにw!実際に行われることは、ファイルの所有者によって異なります。

  • あなた(現在のユーザー)がファイルの所有者である場合、Vimはファイルを書き換える前に書き込み権限を変更します。その後、書き込み権限を削除し、権限ビットを元の状態に戻します。

  • あなたがファイルの所有者ではありませんが、現在のディレクトリに書き込み権限がある場合、Vimは元のファイルを削除し、同じ名前の新しいファイルに文書を書き込みます。これにより、新しいファイルに元のファイルと同じ権限が割り当てられますが、所有権はあなたが持っています。

Vimはファイルに書き込むことができる高い権限を全く取得しません。

上記のメカニズムは、読み取り専用ファイルに書き込む必要があるすべてのプログラムが選択する必要がある使用可能なオプションの1つです(たとえば、ファイルへの書き込み中に一時的に権限を変更するか、ファイルを削除して新しいファイルを作成します)。 Vimが最終的に選択する操作は、最終的に多くの設定可能な設定によって異なります。

以下のコメントに示すように、上記の内容には少し混乱があります。特定のブランドのUnixにVimをインストールするときに実際に何が起こるかを直接確認するには、読み取り専用ファイルを作成するときにVimが実行するシステムコールを追跡することをお勧めします。これが行われる方法は、使用しているUnixによって異なります。 Linuxでは、次のことができますstrace vim file(その後、ファイルを編集して保存して終了します)。w!


これは最初のケースです(OpenBSDからktrace+出力kdump)。

13228 vim      CALL  chmod(0x19b1d94b4b10,0100644<S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH|S_IFREG>)
13228 vim      NAMI  "file"
13228 vim      RET   chmod 0
13228 vim      CALL  lseek(3,0x1000,SEEK_SET)
13228 vim      RET   lseek 4096/0x1000
13228 vim      CALL  write(3,0x19b1e0aa9000,0x1000)

これはファイルの権限を変更して書き込み可能にし(S_IWUSRフラグ付きchmod())、バッファを書き込みます。

次に、元の権限を設定します。

13228 vim      CALL  fchmod(4,0100444<S_IRUSR|S_IRGRP|S_IROTH|S_IFREG>)
13228 vim      RET   fchmod 0
13228 vim      CALL  close(4)
13228 vim      RET   close 0

その他の場合:

まず、ファイルのリンクを解除(削除)してからファイルを再生成します(ファイルに書き込んで後で権限を変更する前)。

44487 vim      CALL  unlink(0x79fdbc1f000)
44487 vim      NAMI  "file"
44487 vim      RET   unlink 0
44487 vim      CALL  open(0x79fdbc1f000,0x201<O_WRONLY|O_CREAT>,0644<S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH>)
44487 vim      NAMI  "file"
44487 vim      RET   open 4

おすすめ記事