Выберите команды из истории Bash

20

Нажатие на кнопку вверх утомительно, и я могу пропустить команду, которую я искал. Поэтому, когда я печатаю historyна терминале, мне выдаются все команды, которые я вводил ранее, с указанием числа. Можно ли просто позвонить по номеру, связанному с командой?

user182936
источник
есть еще интерактивный вариант? они так подвержены ошибкам
Мэтт

Ответы:

31

История bash может сделать много полезных вещей, и поиск, Strg-rкоторый упомянул Терри Ван, является одним из них. Но также возможно сделать именно то, что вы просили.

Вы можете повторно выполнить предыдущую команду с помощью !!. При этом вы также можете редактировать предыдущую команду. Если, например, вы забыли получить права root для команды

apt-get install a-long-list-of-packages

Вам не нужно снова все это перепечатывать. Вместо этого просто позвоните

sudo !!

Если вы хотите повторно выполнить команду в определенной позиции из вашей истории, вы также можете использовать !, например,

!3

чтобы повторно выполнить команду в позиции 3. Имейте в виду, что это считается сверху. Так что, если вы храните 500 команд в своей истории, !1будет "500 команд назад". Вы также можете использовать отрицательные числа. Например

!-2

будет повторно выполнить вторую последнюю команду.

Вы также можете повторно выполнить последнюю команду, которая началась с такой строки, как

!apt-

который будет делать последнюю строку, начинающуюся с «apt-». Если вы хотите, чтобы последняя команда, где строка появилась в любом месте строки, вы можете использовать что-то вроде

!?pt-ge

Есть и другие интересные вещи, которые может сделать история bash. Просто чтобы составить представление о широком спектре возможностей, вы можете специально получить доступ к параметру команды из истории. Так

!-5:3:p

вывел бы третий параметр к пятому из последней команды.

РЕДАКТИРОВАТЬ: Что касается комментария Руди ниже, со стандартными настройками это расширение истории bash действительно выполняется напрямую. Это, вероятно , лучше всего можно описать следующим образом: Вызов , как !-3будет заменена оболочкой с третьей последней командой из истории и затем ваш вход (с заменой) выполняется. Таким образом, если вы печатаете !-3и нажимаете, ENTERи ваша третья последняя команда была ls ~такой же, она фактически такая же, как если бы вы набрали ls ~снова и нажали ENTER«самостоятельно».

Если вы не хотите этого, вы можете установить опцию оболочки histverify. Для установки и отмены параметров оболочки вы можете прочитать shoptкоманду. При использовании histverifyset вызов like !-3только записывает замену из вашей истории в командную строку, но не выполняет ее напрямую. Вы должны, так сказать, нажать на решающее значение ENTERсамостоятельно - или воздерживаться от него, если вы решите.

Хеннинг Кокербек
источник
Так что !это чертовски опасно ... Я хотел бы знать, что !-4именно, прежде чем запустить его. Или это сначала показывает? Классное резюме!
Руди
1
@Rudie Это хороший момент, я обновил свой ответ. Функции истории в основном предназначены для ускорения работы и сохранения нажатий клавиш. Таким образом, стандарт "Вы действительно, действительно, имеете в виду это?" хотя бы частично победит эту цель. И даже если вы могли бы, обычно вы не будете вызывать команду «далеко назад», как !-238. Не должно быть слишком сложно запомнить вашу вторую, третью, последнюю, может быть, последнюю команду;) Как и в случае с Linux (и вообще с вычислениями в целом), ожидается, что вы знаете, что делаете. И если вам действительно нужна дополнительная сетка безопасности, ее уже нет shopt;)
Хеннинг Кокербек
16

Да, есть. Если, например, вы хотите выполнить команду с номером 1234, выполните:

!1234

Другие полезные вещи:

  • Если вы хотите выполнить последнюю команду, выполните:

    !!
  • Если вы хотите выполнить последнюю lsкоманду, выполните:

    !ls
  • Если вы только что побежали ls /some/long/path, и вы хотите, cdчтобы это сделать, выполните:

    cd !$

Чтобы получить больше информации:

Алаа али
источник
6

Используйте комбинацию клавиш Ctrl- r, вы сможете использовать ключевое слово для поиска истории Bash.

Краткое руководство по привязке ключей bash: http://ss64.com/bash/syntax-keyboard.html

Терри Ван
источник
3

Если вы нашли номер истории команды и хотите выполнить ее снова, введите, !а затем введите номер, например, !1234и нажмите Enter. Это часть истории расширения ; Вы можете прикрепить модификаторы на него.

Если вы хотите отредактировать команду перед ее запуском, fc 1234вызывает внешний редактор.

Но, как уже упоминал Терри Ванг , обычно есть более быстрые способы поиска команды в истории, чем определение ее номера в истории, в том числе Ctrl+, Rчтобы вызвать инкрементальный поиск (нажмите, Enterкогда вы нашли команду, которую хотите выполнить), или fc PREFIXвыполнить предыдущую команда, начинающаяся с PREFIX.

Жиль "ТАК - перестань быть злым"
источник
1

Команда historyпокажет все команды и связанные с ними номера. Если вы хотите просто выполнить быструю проверку перед выполнением командной строки # 135, вы можете набрать:

echo !135

Это покажет вам, что будет выполнено.

Брюс М
источник