Есть ли способ выполнить команды из истории?


99

Например:

[root@ip-10-0-7-125 ~]# history | grep free
  594  free -m
  634  free -m | xargs | awk '{print "free/total memory" $17 " / " $ 8}'
  635  free -m
  636  free -m | xargs | awk '{print "free/total memory" $9 " / " $ 10}'
  736  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $9}'
  740  df -h | xargs |  awk '{print "free/total disk: " $11 " / " $8}'
  741  free -m | xargs | awk '{print "free/total memory: " $17 " / " $8 " MB"}'

Мне просто интересно, есть ли способ выполнить команду 636 без ее повторного ввода, просто введите что-нибудь плюс число, например, историю 636 или что-то в этом роде.


14
ты знаешь о чем ctrl-r?
Карлос Кампдеррос

1
Да, я знаю это, но это не совсем то, что я хочу.
The One

Ответы:


171

В bash просто !636все будет хорошо.


12
In Linux- Это больше относится к оболочке (bash, zsh и т. Д.), В которой работает человек, а не ОС, в которой он запущен. В Linux есть оболочки без поддержки истории.
Зоредаче

@Zoredache И аналогично, это прекрасно работает в большинстве реализаций bash в Windows.
Ajedi32

1
Конечно, не только bash, но и другие оболочки - включая csh.
Дрю

5
Если у вас есть команда, которая очень похожа на то, что вы хотите запустить, вы можете добавить :pкоманду напечатать, !636:pнапример, без ее запуска . Это означает, что вы можете легко выбрать его снова из своей истории, нажав стрелку вверх и внести незначительные изменения, которые вы хотите
AJefferiss

78

Да, это называется «расширение истории». Видеть

LESS='+/^HISTORY EXPANSION' man bash

для полной информации.

Использование восклицательного знака с последующим числом, возможно, является самым простым:

!636

Однако вы также можете запустить последнюю выполненную команду напрямую, не зная ее номера истории:

!!

Или вы можете запустить две команды назад:

!-2

Однако чаще всего я использую форму для повторения последнего аргумента последней команды:

echo this text goes into a file > /tmp/afile.txt
cat !$

Или, скажем, я проверяю файл. Используя завершение вкладки, я мог бы сделать следующее:

ls -l /really/long/path/to/some/file
less !$

Снова, прочитайте справочную страницу для более подробной информации:

LESS='+/^HISTORY EXPANSION' man bash

25
Интерактивно, Alt-.может быть удобнее, чем !$. Он вставляет последний аргумент последней команды дословно в строку.
ulidtko

2
@ulidtko Где эти специальные побеги задокументированы (я знал !$, но никогда не слышал Alt-.)? Вы разместите ссылку на него, пожалуйста?
edmz

5
LESS="+/DEFAULT KEY BINDINGS" man 3 readline, /etc/inputrc, ~/.inputrc. Многие программы, кроме bash, используют libreadline; для тех , кто это делает, вы получите ту же функцию , такие как Alt-., Ctrl-X-U(отменить), Ctrl-/(опишите ярлык), закладка-завершение и т.д. - бесплатно. Например, всего с тремя строками в PYTHONSTARTUPодной можно включить завершение табуляции и историю в стандартном питоне REPL . Который будет работать (в основном) так же, как в bash, поскольку эту работу выполняет библиотека GNU Readline. На странице readline подробно описаны функции.
ulidtko

2
Кроме того, Ctl-UpArrow (или AltUpArrow на bash) прокрутит список истории назад. Набрав несколько символов, UpArrow получает только команды, начинающиеся с этой буквы, например, "fr (Ctl-Up)" прокручивает все команды "free ..." в списке OP. Это также работает в таких вещах, как gnuplot и gdb, которые используют readline.
jamesqf

2
@ Ajedi32, см. Последнюю строчку в моем ответе. :) По правде говоря, этот ответ - только вкус того, что может сделать расширение истории . Имейте в виду, что это на уровне оболочки, а не команды, которую вы вызываете; отсюда echo {1..5}следует touch !$коснуться пяти файлов, а не только одного. Строго говоря, это не последний аргумент, а последнее слово оболочки в этой строке. (Также попробуйте echo hello >tempследовать echo goodbye !$.) Если вы можете придумать способ сделать его более четким, не стесняйтесь предложить редактирование.
Wildcard

14

Хороший, если вы не хотите в первую историю, запишите номер и т.д .:

в Bash (и, возможно, другие):

ctrl-r something 

( ctrl-r= "Обратный поиск в интерактивном режиме") ( something= часть предыдущей команды)

Это покажет вам последнюю строку истории, содержащую something. Чтобы получить предыдущий, снова выполните ctrl-r (один), каждый раз, когда он получает предыдущую строку.

например:

ctrl-r  10

чтобы показать последнюю строку истории, содержащую '10' (например, строку с $10, в вашем примере), и ctrl-rснова, пока вы не получите строку истории, которую вы искали

Когда линия вы хотите появиться, просто Enterзапустить его (или вы можете изменить его, используя arrow keys, backspaceи ctrl-aидти в начале строки, ctrl-eчтобы добраться до конца, ctrl-k: «убить» от курсора до конца строки (= удаляет + сохраняет его в буфере) ctrl-y,: восстановить из буфера ранее уничтоженный бит и т. д.)

Если вы хотите искать вперед (ctrl-s), вам сначала нужно отключить XON : см. Https://stackoverflow.com/a/791800/1841533 :

«просто отключить XON / XOFF, запустив

stty -ixon

"(и тогда вы сможете использовать Ctrl-S, не заставляя его заморозить терминал)


Если я сделаю это и случайно нажму ctrl-r один раз слишком много, есть ли какой-нибудь способ снова искать вперед в истории?
Касперд

@kasperd: Да, вы можете. Многие ответы на это указывают: Ctrl-S для прямого поиска.
Оливье Дюлак

К сожалению, ctrl-s используется для замораживания терминала, и bash не отключает это, так что не работает в конфигурации по умолчанию. (Другие программы, такие как emacs, отключают привязку клавиш, чтобы заморозить терминал, чтобы ctrl-s можно было использовать для поиска.)
kasperd

@kasperd: Да, извините, что не упомянул об этом раньше (я указал «много ответов», потому что они точно уточняют это, но я не нашел времени, чтобы напечатать это в комментарии или дать ссылку ... (Я использовал свой телефон). Теперь я вернулся домой и мог отредактировать это в ответе выше. Для поиска по bash ctrl-s нужно сначала stty -ixon
Olivier Dulac

Эта команда нарушит нормальное использование ctrl-s, так что это на самом деле не вариант.
Касперд

7

Вы можете использовать встроенную оболочку fc :

fc -s 636

2
Это на самом деле лучше, чем принятый ответ, но вы должны удалить, -sчтобы получить преимущества. Если вы запустите, fc 636вы откроете редактор с командой 636 из вашей истории в буфере, и когда вы сохраните и выйдете, команда (измененная или нет) будет запущена. И даже лучше, этот POSIX-совместимый .
Wildcard

@ StevenPenny Спасибо. И да, я знаю, что такое POSIX, хотя не вижу смысла. В любом случае, было бы неплохо получить доступ к некоторой легко доступной и включенной документации.
Фахим Митха

@FaheemMitha попробуйте запустить "help fc."
Wildcard

@Wildcard help- это не POSIX - возможно, придется сделать man dashили подобное
Стивен Пенни

@ Wildcard Спасибо. Я склонен забывать, что helpсуществует. Еще одна встроенная оболочка. И загадка для неосторожных пользователей, которые могут захотеть помочь с новой системой, но вместо этого сталкиваются с потоком тарабарщины. :-(
Фахим Митха

3

Есть HSTR- hhкоманда для bashи zshинтерактивного выбора команды, лучше чем Ctrl-R обратный поиск:

hh пример интерактивной истории

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

В Ubuntu вы можете установить hhсо следующей однострочной:

sudo add-apt-repository ppa:ultradvorka/ppa && sudo apt-get update && sudo apt-get install hh && hh --show-configuration >> ~/.bashrc

или шаг за шагом:

sudo add-apt-repository ppa:ultradvorka/ppa
sudo apt-get update
sudo apt-get install hh

Установить hhна Fedora, RHEL или CentOS:

sudo dnf|yum install hstr -y

В macOS с homebrew:

brew install hh

... затем настройте его:

hh --show-configuration >> ~/.bashrc

Это заменит поведение по умолчанию Ctrl-R.

Запустите, hh --show-configurationчтобы определить, что будет добавлено в ваш профиль Bash.

Дополнительные параметры конфигурации доступны на домашней странице проекта на Github: https://github.com/dvorka/hstr.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.