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

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

関連記事

Linux

【Linux】Info マニュアルの基礎知識と、閲覧に便利な pinfoコマンド

目次1. オンラインマニュアル (manコマンド)と Infoマニュアル (infoコマンド)2. Info マニュアルの基礎知識Info マニュアルのデータpinfo コマンドウェブ版もあります3. …

Linux

systemctl コマンドの引数の順番は不便?

最近の Linux では、systemd というツールが導入されています。 systemd にはいろいろな役割があるのですが、その中でも大きいのが「各サービスの管理(操作)」です。 本記事は、この操作 …

Linux

コマンドラインからメールを送信する方法

Linux (や Mac) のターミナルエミュレータ上からメールを送信するコマンドを紹介します。 目次1. sendmail2. mail3. telnet4. おわりに 1. sendmail se …

CentOS

CentOS 6 で yum update した時、remi-php70 レポジトリ内のパッケージの依存性解決ができない場合の解決方法

目次現象解決方法 その1解決方法 その2解決方法 その3まとめ参考 現象 remi-php70 リポジトリを使っている CentOS 6 の環境で PHP関連のパッケージを更新しようと思い、以下のコマ …

Let's Encrypt

Let’s Encrypt でワイルドカードを使う

手持ちの CentOS 7 に入れてある certbot パッケージが バージョン 0.22.0 になり、Let’s Encrypt のワイルドカードに対応しましたので試してみました。 目 …