Linux

Vim でファイルを編集した後、sudo でそのファイルを保存する

投稿日:2019年3月12日 更新日:

1. 困った状況

Vim でファイルを編集した後に、sudo で開いていないことに気付いた場合の対処法です。
(sudo を使わないと、そのファイルを上書きする権限がない状況)

2. 対応方法

Vim 内で以下のコマンドを実行します。

:w !sudo tee % > /dev/null
各文字列の意味
文字列 意味
:w
  • カレントバッファの内容を、引数で指定されたファイルに送る vim のコマンド
  • 今回の場合は、tee コマンドに送っている。
! vim のコマンドライン上で、外部のコマンドを実行するには、頭に「!」が必要
sudo sudo コマンド
tee
  • tee コマンドは、標準入力から受け取ったデータを、標準出力とファイルの2つに出力するコマンド。
  • ここでは、:w から受け取ったデータを % に送っている。
  • この「標準入力から受け取ったデータを、指定したファイルに出力する」という動作を行うコマンドが他にないので tee を使っている。
% カレントファイル
> /dev/null tee は受け取ったデータを標準出力にも出力するが、それは必要ないので /dev/null に向けて捨てている。

すると以下のようなメッセージが表示されます。

コマンド実行直後
コマンド実行直後

ここに表示されている通り、すでにファイルは上書きされていますので、[OK] という意味で O キーを押しましょう。

Enter キーを押します
Enter キーを押します

この時点で、「どこか変更した」ことを示す [+] が表示されていますが、これは無視します。ちゃんと変更点は上書きされているはずです。

どこか変更したことを示す[+]が表示されていますが無視します
どこか変更したことを示す[+]が表示されていますが無視します

あとは、以下のコマンドで強制的に Vim を終了します。

:q!

3. ~/.vimrc にキーマップを登録する

~/.vimrc ファイルに以下を記述すると、先程のコマンドを :w!! というキーにマッピングすることができます。

cmap w!! w !sudo tee > /dev/null %

4. 参考

📂-Linux

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

SELinux

Webサーバーがサイトの構成ファイルを上書きできない問題に対応する(SELinuxが原因の場合)

目次1. はじめに2. 前提3. CentOS 7 の SELinux4. 対応手順5. おわりに参考 1. はじめに Webサイトによっては、そのWebサイトを構成しているファイルを自分で更新する場 …

CentOS

CentOS 8 で Snap から certbot パッケージをインストールする

CentOS 8 で Snap から certbot パッケージをインストールする方法について説明します。

CentOS

CentOS Stream 8 の PHP 7.2 を 7.4 に変更する

CentOS Stream 8 の PHP 7.2 を 7.4 に変更する作業について説明します。

Linux

Linux のコマンドラインで発生するビープ音を消す

Linux のコマンドでビープ音を消す方法を紹介します。

Linux

【Linux】 CentOS のマニュアル

CentOS は、RHEL (Red Hat Enterprise Linux)のソースコードから商標や商用パッケージ等を除去してリビルドした RHELクローンです。 マニュアルを見る場合は、RHEL …