Що робить “apt-get install !!” та як змусити її працювати?


54

Я бачив, як хтось набирав текст

apt-get install !!

Він робив це кілька разів і кожного разу встановлювалася інша програма. Схоже, він автоматично з'ясував, що потрібно далі.

Однак, коли я спробував це на своїй віртуальній машині Ubuntu 14.04.1 LTS, він просто показав деякі інструкції щодо використання. Google apt-get install !!, схоже, не працює дуже добре. Багато результатів пошуку не містять подвійного знака оклику.

Що apt-get install !!робити і що може бракувати на моїй машині, щоб вона не працювала?


Відповіді:


74

!! - це ярлик у bash, що означає останню виконану команду.

Спробуйте це:

 echo hello
 !!

У цьому контексті !!воля буде розширена на інший echo hello.

Я уявляю, що сталося, якщо вони намагалися запустити команду, і це не вдалося, і скаржилося, що її не встановлено. Тоді вони набрали, sudo apt-get install !!тому що назва пакету збігалася збігається з назвою команди, яку вони намагалися запустити. Отримана команда намагатиметься встановити пакет з тим же ім'ям, що і команда, яку вони щойно намагалися виконати.


10
Так, це, мабуть, все. Якщо я запускаю lynx, бачу, що він не встановлений, а потім запускаю, apt-get install !!він встановлює рись. Це не спрацювало для мене, тому що я спробував 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, означає останній елемент історії баш. !-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, встановлюється.

Я б запропонував вам не робити цього (якщо ви не впевнені в цьому), якщо висловлюватися явно, це не шкодить.


2
Відмінне пояснення для !!. Я знав, що це означає, але мені подобається, як ви це описали.
Терранс

1
+1 за попередження не намагатися цього вдома.
Шадур

16

!!: Зверніться до попередньої команди. Це синонім для !-1( Джерело ).

Наприклад, якщо я виконую:

./test

тоді пам’ятайте, що мені потрібно бути Root, тоді я можу просто набрати:

sudo !!

це те саме, що вводити текст:

sudo ./test

Корисно, коли остання команда містить багато символів.


1
Блискуче! Я ніколи не думав про sudo !!команду; те, що я роблю роками, - це натиснути клавішу вгору один раз, потім перемістити курсор вліво і додати sudo.
IQAndreas

1
@IQAndreas Ваш спосіб дає вам можливість двічі перевірити команду, що не є поганим при запуску sudo.
Метт Нордхофф

1
Я завжди читаю "судо !!" як "я мав на увазі
судо

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 чи будь-які інші) комбінації клавіш, і це буде найкраще, що ви зробили сьогодні!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.