Co robi „apt-get install !!” i jak to zrobić?

54

Widziałem, jak ktoś pisze

apt-get install !!

Robił to kilka razy i za każdym razem instalowany był inny program. Wygląda na to, że automatycznie zorientował się, co jest potrzebne dalej.

Jednak gdy wypróbowałem to na mojej maszynie wirtualnej Ubuntu 14.04.1 LTS, po prostu pokazałem kilka instrukcji użytkowania. Googling apt-get install !!nie wydaje się działać zbyt dobrze. Wiele wyników wyszukiwania nie zawiera podwójnego wykrzyknika.

Co robi apt-get install !!i czego może brakować na moim komputerze, że nie działa?

Thomas Weller
źródło
1
Zobacz także: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Odpowiedzi:

74

!! jest skrótem w bash, który oznacza ostatnie wykonane polecenie.

Spróbuj tego:

 echo hello
 !!

W tym kontekście !!zostanie on rozszerzony na inny echo hello.

Wyobrażam sobie, co się stało, gdy próbowali uruchomić polecenie, które się nie powiodło i narzekało, że nie zostało zainstalowane. Więc wpisali, sudo apt-get install !!ponieważ nazwa pakietu była przypadkowo taka sama jak nazwa polecenia, które próbowali uruchomić. Wynikowe polecenie spróbuje zainstalować pakiet o tej samej nazwie, co polecenie, które właśnie próbowali wykonać.

Stephen
źródło
10
Tak, to chyba wszystko. Jeśli uruchomię lynx, zobacz, że nie jest zainstalowany, a następnie uruchom apt-get install !!instaluje Lynx. Nie działało to dla mnie, ponieważ próbowałem apt-get install !!jako jedyne polecenie.
Thomas Weller
4
Innym powszechnym zastosowaniem jest, gdy coś powinno być uruchomione jako sudo, na przykład apt-get installcoś.
MBraedley,
6
@AL: najpierw piszesz apt-get install some-program, a kiedy zdajesz sobie sprawę, że nie masz uprawnień, po prostu się sudo !!rozwija sudo apt-get install some-program.
mgarciaisaia
3
!!to pseudonim !-1oznaczający ostatni element w historii bash. !-2jest przedostatni i tak dalej.
Tim
41

!!nie ma z tym nic wspólnego apt-get. Jest to słowo kluczowe powłoki, które zostanie rozwinięte do poprzedniego polecenia. To rozszerzenie jest wykonywane przez powłokę przed interpretacją bieżącego polecenia.

Od man bash:

!! Zobacz poprzednie polecenie. To synonim `! -1 '.

Na przykład, jeśli uruchomisz polecenie:

echo "foo"

Następnie, jeśli uruchomisz:

sudo apt-get install !!

zostanie rozszerzony do:

sudo apt-get install echo foo

Jak widać, jest on rozszerzony na dwa pakiety, a echodrugi jest foo. Nie ma samodzielnego pakietu o nazwie fooi echo. Oprócz wbudowanej powłoki echoistnieje /bin/echoplik wykonywalny będący częścią pakietu GNU-coreutils. Pojawią się więc błędy informujące, że żadne takie pakiety nie są dostępne.

Z drugiej strony druga osoba może robić coś takiego:

$ 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.

Jak widać cowsayjest instalowany.

Sugeruję, abyś tego nie robił (o ile nie masz pewności), ponieważ wyrażanie się wprost nie szkodzi.

heemayl
źródło
2
Świetne wytłumaczenie dla !!. Wiedziałem, co to znaczy, ale podoba mi się sposób, w jaki to opisałeś.
Terrance
1
+1 za ostrzeżenie, by nie próbować tego w domu.
Shadur
16

!!: Patrz poprzednie polecenie. To jest synonim !-1( Źródło ).

Na przykład, jeśli wykonam:

./test

wtedy pamiętaj, że muszę być rootem, a następnie mógłbym po prostu wpisać:

sudo !!

to to samo, co pisanie:

sudo ./test

Jest to przydatne, gdy twoje ostatnie polecenie zawiera wiele znaków.

Bilal
źródło
1
Znakomity! Nigdy nie myślałem o sudo !!poleceniu; to, co robię od lat, to naciśnij raz klawisz w górę, a następnie przesuń kursor do końca w lewo i dodaj sudo.
IQAndreas
1
@IQAndreas Twoja droga daje ci możliwość dwukrotnego sprawdzenia polecenia, co nie jest złe podczas działania sudo.
Matt Nordhoff,
1
Zawsze czytam „sudo !!” jako „miałem na myśli sudo na litość boską”
Viktor Mellgren
1
@Vixen: W takim razie pieprzenie może być również dla ciebie
Thomas Weller
@IQAndreas przesuwanie kursora do końca w lewo wydaje się zbyt nudne. Dlaczego nie tylko Ctrl+Alub przynajmniej Home?
Ruslan
2

Na pytanie już udzielono odpowiedzi, więc nie będę się powtarzać. Chciałbym jednak zauważyć, że istnieje wiele takich skrótów w różnych powłokach, które pomagają powtarzać / znajdować / edytować polecenia. Niektóre z tych, których używam to:

  1. !$następnie ENTERwpisz ostatnie słowo ostatniego polecenia. Na przykład,

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

To cię wyląduje /let/me/in

  1. Ctrl- Ra następnie wpisz kilka słów z poprzedniego polecenia. Na przykład, jeśli wpisane vi /home/mycoolproject.sha następnie go z niektórych przypadkowych poleceń takich jak ls, cd, pwditp następnie wpisanie Ctrl- Rnastępnie coolbędzie ciągnąć się, że vipolecenie.

Wystarczy wyszukać skróty klawiaturowe bash (csh lub cokolwiek innego), a będzie to najlepsza rzecz, jaką zrobiłeś dzisiaj!

Hopping Bunny
źródło