質問: パーミッションなしで開いたときにvimを使ってファイルを強制的に編集する 私はvimを使ってファイルを編集します。時々、私は適切なパーミッションを忘れています。私はvimとファイルを読み取り専用ファイルとして実行します。私は変更を加えることができますが、実際には変更を書くことはできません。ときどきファイルを開いて変更を加え、sudoでそれを実行しなかったことに気付き、自分自身に叫び、それから強制終了して再度rootユーザーとして開きます。これに対する回避策はありますか?ファイルの読み取り専用ステータスにもかかわらず、ファイルへの変更を強制することはできますか?少なくとも変更を保存し、差分を実行し、ファイルをマージすることはできますか?
回答: これを行うには2つの方法が考えられます。最初の方法はあなたがファイルを所有していると仮定しますが、ファイルはreadonlyです。自分のreadonlyファイルを強制的に上書きするには、writeコマンドの末尾にviの感嘆符を使用するだけです(:w!)。これはもちろん、あなたが現在のフォルダに書き込みと実行をする許可を持っていることを前提としています。:w! viが元のreadonlyファイルを上書きします。2番目の方法は、他の誰かがファイルを所有していると仮定していて、あなたはそのファイルへの変更を保存したいと思いますこれを実現する1つの方法は、vi内からedスクリプトとして元のファイルに加えられた変更を保存することです。このedスクリプトは、後にedラインエディタを使ってvi以外の元のファイル(または他の同様のファイル)に適用することができます。現在の編集セッションをedスクリプトとして保存する方法は、 - edコマンドラインスイッチを使用して元のファイル名と編集済みのviバッファを標準入力としてdiffユーティリティに渡すことです。つまり、差分をedスクリプトとして表示します。それで、編集されたviバッファを仮定して、そして以下を実行してください。:.,$!diff --ed [original_file] - これはカレントバッファ(。、$!)内のすべての行をオリジナルファイルをカレントバッファの内容に変換するのに必要なdiffで生成されたedスクリプト(diff --ed [original_file] - )で置き換えます。それから、このedスクリプトを安全な場所に保存し、そのスクリプトを書き込み可能な元のファイルのバージョンに適用します。そのため、スクリプトを書き込み可能な場所(たとえば、ログインフォルダ)に保存します。:w ~/my_ed_script それではviを終了し、このedスクリプトを使用して、最初に保存できなかった編集済みファイルを入手します。これをbashコマンドラインプロンプト '$'から実行する方法は次のとおりです。$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file このコマンドシーケンスが言葉で行うことは、生成したスクリプトをdiffで連結し、ed writeコマンド「w」をedの標準入力にエコーすることです。次に、edはこのスクリプトを元のファイルの書き込み可能なコピーに適用し、それらの変更されたバッファの変更をファイルに書き戻します。これは、viで実行された作業を、元々vi、diff、およびedを使用して他のユーザーが所有していたファイルに保存する方法です。