「apt-get install !!」は何をし、どのように機能させるのですか?


54

誰かがタイプしているのを見ました

apt-get install !!

彼はそれを数回行い、毎回、異なるプログラムがインストールされました。次に必要なものを自動的に把握したようです。

ただし、Ubuntu 14.04.1 LTS仮想マシンで試してみたところ、いくつかの使用方法が示されていました。Googling for apt-get install !!はうまく機能していないようです。多くの検索結果には二重感嘆符が含まれていません。

何がapt-get install !!やるとそれが機能しなかったことを私のマシン上で不足していることだろうか?


回答:


74

!! 最後に実行されたコマンドを意味するbashのショートカットです。

これを試して:

 echo hello
 !!

このコンテキストでは、!!は別のに展開されecho helloます。

何が起こったのか、彼らはコマンドを実行しようとして失敗し、インストールされていないという苦情があったと思います。sudo apt-get install !!パッケージ名が実行しようとしたコマンドの名前と偶然同じだったので、彼らはタイプしました。結果のコマンドは、実行しようとしたコマンドと同じ名前でパッケージをインストールしようとします。


10
はい、それはおそらくそれです。を実行するとlynx、インストールされていないことがわかり、実行しapt-get install !!てlynxをインストールします。私apt-get install !!が唯一のコマンドとして試みたので、それは私にとってはうまくいきませんでした。
トーマスウェラー

4
別の一般的な用途は、何かを実行するsudoなど、apt-get install何かを実行する必要がある場合です。
MBraedley

6
@AL:最初に入力apt-get install some-programしますが、権限がないことに気づいたら、ちょうどsudo !!に展開されsudo apt-get install some-programます。
mgarciaisaia

3
!!はのエイリアスで!-1、bash履歴の最後のアイテムを意味します。!-2最後から2番目などです。
ティム

41

!!とは何の関係もありませんapt-get。これは、前のコマンドに展開されるシェルキーワードです。この展開は、現在のコマンドが解釈される前にシェルによって行われます。

からman bash

!! 前のコマンドを参照してください。これは `!-1 'の同義語です。

たとえば、コマンドを実行する場合:

echo "foo"

次に、実行する場合:

sudo apt-get install !!

以下に展開されます。

sudo apt-get install echo foo

あなたが見ることができるように、それはすなわち、二つのパッケージに展開されecho、他方がありますfoofooand という名前のスタンドアロンパッケージはありませんecho。離れたシェルからの組み込みechoがある/bin/echoGNU-coreutilsのパッケージの一部である実行可能ファイル。そのため、そのようなパッケージは利用できないというエラーが表示されます。

一方、他の人は次のようなことをしている可能性があります。

$ cowsay
The program 'cowsay' is currently not installed. You can install it by typing:
sudo apt-get install cowsay

$ sudo apt-get install !!
sudo apt-get install cowsay
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  filters
The following NEW packages will be installed:
  cowsay
0 upgraded, 1 newly installed, 0 to remove and 119 not upgraded.
Need to get 18.5 kB of archives.

ご覧のとおりcowsay、インストールされています。

明示的であっても害はないので、(これが確実でない限り)これをしないことをお勧めします。


2
の素晴らしい説明!!。私はそれが何を意味するか知っていましたが、あなたがそれを説明した方法が好きです。
テランス

1
自宅でこれを試さないという警告のために+1。
シャドゥール

16

!!:前のコマンドを参照してください。これは!-1(The source)の同義語です。

たとえば、私が実行した場合:

./test

次に、ルートになる必要があることを覚えておいて、次に入力するだけです:

sudo !!

入力と同じです:

sudo ./test

最後のコマンドに多くの文字が含まれている場合に便利です。


1
ブリリアント!私はこのsudo !!コマンドについて考えたことはありません。私が何年もやってきたことは、上キーを一度押してから、カーソルを一番左に移動してを追加することsudoです。
IQAndreas

1
@IQAndreasあなたの方法は、コマンドを再確認する機会を与えてくれます。これは実行時に悪いことではありませんsudo
マットノルドホフ

1
私はいつも「sudo !!」と読みます 「私はf ***のためにsudoを意味していました」
Viktor Mellgren

1
@Vixen:その場合は、thefuckはまたあなたのために何かかもしれない
トーマス・ウェラー

@IQAndreasがカーソルを一番左に移動すると、つまらないように見えます。なぜだけではなく、Ctrl+Aあるいは少なくともHome
ルスラン

2

質問はすでに回答されているので、繰り返しはしません。ただし、コマンドの繰り返し/検索/編集を支援するさまざまなシェルには、このようなショートカットが多数あることを指摘したいと思います。私が使用するもののいくつかは次のとおりです。

  1. !$続いてENTER、最後のコマンドの最後の単語を入力します。例えば、

    ls -l /let/me/in
    cd !$
    

これであなたが着陸します /let/me/in

  1. Ctrl- R次に、前のコマンドからいくつかの単語を入力します。あなたが入力した場合たとえば、vi /home/mycoolproject.shのようないくつかのランダムなコマンドでそれをして、その後lscdpwdなど、そしてちょうどタイピングCtrl- R続いcoolているプルアップされますviコマンドを。

bash(またはcshなど)のキーボードショートカットを検索するだけで、今日あなたがしたことの中で最高のものになります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.