Что делает «apt-get install !!» и как заставить его работать?

54

Я видел, как кто-то печатал

apt-get install !!

Он делал это несколько раз, и каждый раз устанавливалась другая программа. Кажется, он автоматически выяснил, что нужно дальше.

Однако, когда я попробовал это на моей виртуальной машине Ubuntu 14.04.1 LTS, он просто показал некоторые инструкции по использованию. apt-get install !!Похоже, поиск в Google не очень хорошо работает. Многие результаты поиска не содержат двойной восклицательный знак.

Что делает apt-get install !!и чего может не хватать на моей машине, чтобы она не работала?

Томас Веллер
источник
1
Смотрите также: stackoverflow.com/q/15137461/3488231
ace_HongKongIndependence

Ответы:

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предпоследний и тд.
Тим
41

!!не имеет ничего общего с apt-get. Это ключевое слово оболочки, которое будет расширено до предыдущей команды. Это расширение выполняется оболочкой до интерпретации текущей команды.

От man bash:

!! Обратитесь к предыдущей команде. Это синоним `! -1 '.

Например, если вы запускаете команду:

echo "foo"

Тогда, если вы запустите:

sudo apt-get install !!

он будет расширен до:

sudo apt-get install echo foo

Как видите, он разбит на два пакета, а именно - echoна другой foo. Не существует отдельного пакета с именем fooи echo. Помимо встроенной оболочки echoесть /bin/echoисполняемый файл, который является частью пакета GNU-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, устанавливается.

Я бы посоветовал вам не делать этого (если вы не уверены), если вы будете откровенны, это не повредит.

heemayl
источник
2
Отличное объяснение !!. Я знал, что это значит, но мне нравится, как ты это описал.
Терренс
1
+1 за предупреждение, чтобы не попробовать это дома.
Шадур
16

!!: Обратитесь к предыдущей команде. Это синоним !-1( Источник ).

Например, если я выполню:

./test

тогда помните, что мне нужно быть Root, тогда я мог бы просто набрать:

sudo !!

это то же самое, что печатать:

sudo ./test

Это полезно, когда ваша последняя команда содержит много символов.

Билал
источник
1
Brilliant! Я никогда не думал о sudo !!команде; то, что я делал годами, - это один раз нажмите клавишу вверх, затем переместите курсор влево и добавьте sudo.
IQAndreas
1
@IQAndreas Ваш способ дает вам возможность перепроверить команду, что неплохо при запуске sudo.
Мэтт Нордхофф
1
Я всегда читаю "sudo !!" как «я имел в виду
судо
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и последовал за ним с некоторыми случайными командами , как ls, cd, pwdи т.д. , то просто набрав Ctrl- а Rзатем coolбудет тянуть , что viкоманды.

Просто найдите сочетания клавиш bash (или csh или что-то еще), и это будет лучшее, что вы сделали сегодня!

Прыгающий кролик
источник