sudoを忘れて怒られてしまったら、びっくり(!!)すればいい
タイトルは釣りです。
怒られが発生
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 update
やdocker ps
など、sudo
忘れて怒られたときに重宝しますね。
おまけ !!で展開されるコマンドを目視確認してから実行する
『enterキーを押下すると!!
部分が自動で展開されたうえでコマンドが実行されちゃうの怖い』 という方に朗報です。enterキー押下で!!
が展開されるようになるHISTVERIFYというシェルのオプションがあります。
このオプションを有効にすると、コマンドを実行すべくenterキーを押しても!!
部分が展開されるだけでコマンドは実行されません。展開されたコマンドを確認し問題がなければ、もう一度enterキーを押してコマンドを実行する形になります。意図しないコマンドをsudo
をつけて実行してしまうことがなくなる良いオプションですね。
rcファイルに追記すべき項目は以下のとおりです。
bashの場合
shopt -s histverify
zshの場合
setopt HISTVERIFY
注意書き
Bashの履歴展開 `!何々` による事故2選 #7zip - Qiita
こういう事故もあるそうですので、複雑な履歴展開は素人にはおすすめできないかもしれない……用法用量を守って正しくお使いください。
Discussion