web-dev-qa-db-ja.com

パーミッションなしで開いたときにvimを使ってファイルを強制的に編集する

私はvimを使ってファイルを編集します。時々、私は適切なパーミッションを忘れています。私はvimとファイルを読み取り専用ファイルとして実行します。私は変更を加えることができますが、実際には変更を書くことはできません。ときどきファイルを開いて変更を加え、Sudoでそれを実行しなかったことに気付き、自分自身に叫び、それから強制終了して再度rootユーザーとして開きます。

これに対する回避策はありますか?ファイルの読み取り専用ステータスにもかかわらず、ファイルへの変更を強制することはできますか?少なくとも変更を保存し、差分を実行し、ファイルをマージすることはできますか?

49
andor kesselman

現在の問題に応じて、いくつかの異なるアプローチがあるようです。

  1. viによる読み取り専用。あなたのファイルが:set readonlyを持っているなら、あなたはそうすることができます
    • 書き込みを強制するには:w!を使います。
    • :set noreadonlyを発行してから通常の:wを使用する
  2. 許可問題(Sudo):書くことはできませんが、Sudoの権利はあります。
    • 問題::w !Sudo tee %。これはバッファをteeに書き込みます。これはパイプ情報を受け取り、ファイルに書き込めるコマンドです。そしてteeがSudoの権限で実行されると、teeはファイルを修正することができます。
  3. 許可の問題(いいえSudo):あなたはファイルを書く権限を持っていませんし、あなたは管理者アクセスを持っていません。
    • :w! ~/tempfile.extを使用して変更内容を一時ファイルに書き込み、次に一時ファイルをディレクトリに移動する(一時ファイルをディレクトリの所有者/管理者に送信する)ための対策を講じます。

あなたはここでそれについてもっと読むことができます:

  1. StackOverflowから
  2. Geekyboyから
  3. Data Agaricから

ショートカット

よくあることですが、問題#2(許可問題、Sudo付き)、あなたの/etc/vim/vimrc(または~/.vimrc)にできる次のショートカット

  • cnoremap w!! execute 'silent! write !Sudo tee % >/dev/null' <bar> edit!

そうすれば、Sudoで保存するために:w!!とタイプすることができます。ここでは説明しませんが、上記の参考文献は多くの近道を網羅しています。

78
Dr Beco

これを行うには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を使用して他のユーザーが所有していたファイルに保存する方法です。

4
Billy McCloskey

ファイルへの書き込み権限がない場合のケースをカバーしたいだけです。

:!chmod +w %
:w!

その間にvimはファイルの変更について文句を言うでしょう(フラグの変更のため) - それらを無視することは明らかに安全です

1
yatsa

あなたがSudo特権を持っていない場合のためのもう一つの可能​​性は、:w /somewhere/where/i/have/permissions/foo.txtを使い、そして Ryan Fox のように、後でパーミッションの問題を扱うことです。