‼️

sudoを忘れて怒られてしまったら、びっくり(!!)すればいい

2024/10/17に公開

タイトルは釣りです。

怒られが発生

sudoを忘れてシェルに怒られた経験は誰しもお持ちでしょう。私もよくあります。たとえばこんなふうに。

$ apt update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)

この例だと、3行目で「エラー。権限がなくてファイルが開けない」とシェルに怒られているわけです。

こんなときは「あー」と思いつつsudoをつけてsudo apt updateなどと入力しなおしていたわけですが、もっと楽な方法を知りました。

sudoに怒られたらびっくり(!!)する方法

怒られたあとに、以下のようにビックリマークを使って「びっくり」を表現してみましょう。

$ sudo !!

大事なことなのでビックリマークは2回使う必要があります‼️ するとあら不思議‼️

$ sudo !!
sudo apt update
[sudo] password for ubuntu:
Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
Get:4 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]
Hit:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease
Get:6 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [2,072 kB]
Get:7 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,131 kB]
Fetched 3,460 kB in 2s (1,417 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
45 packages can be upgraded. Run 'apt list --upgradable' to see them.

権限が必要なコマンドが問題なく実行されました。

種明かし

これはBashやZshの履歴展開と呼ばれる機能です。エクスクラメーションマーク(!) を使うと、シェルの履歴を呼び出すことができます。上述のエクスクラメーションマークを2個続ける記法は、「直前の履歴を展開する」という意味になります。apt updatedocker psなど、sudo忘れて怒られたときに重宝しますね。

おまけ !!で展開されるコマンドを目視確認してから実行する

『enterキーを押下すると!!部分が自動で展開されたうえでコマンドが実行されちゃうの怖い』 という方に朗報です。enterキー押下で!!が展開されるようになるHISTVERIFYというシェルのオプションがあります。

このオプションを有効にすると、コマンドを実行すべくenterキーを押しても!!部分が展開されるだけでコマンドは実行されません。展開されたコマンドを確認し問題がなければ、もう一度enterキーを押してコマンドを実行する形になります。意図しないコマンドをsudoをつけて実行してしまうことがなくなる良いオプションですね。

rcファイルに追記すべき項目は以下のとおりです。

bashの場合

shopt -s histverify

zshの場合

setopt HISTVERIFY

注意書き

Bashの履歴展開 `!何々` による事故2選 #7zip - Qiita

こういう事故もあるそうですので、複雑な履歴展開は素人にはおすすめできないかもしれない……用法用量を守って正しくお使いください。

参照

Discussion