Чи є якийсь спосіб виконувати команди з історії?


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
Так, я це знаю, але це не зовсім те, що я хочу.
Один

Відповіді:


170

У баш, просто !636буде добре.


12
In Linux- Це більше стосується оболонки (bash, zsh тощо), яку людина працює, а потім ОС, на якій ви її запускаєте. На Linux є оболонки без підтримки історії.
Зоредаче

@Zoredache І так само це добре працює в більшості реалізацій bash на Windows.
Ajedi32

1
Не тільки баш, звичайно, але й інші снаряди - включаючи 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-.може бути зручніше, ніж !$. Він вставляє в рядок останній аргумент останньої команди дослівно .
улідко

2
@ulidtko Де задокументовані ці спеціальні втечі (я про це знав !$, але про нього ніколи не чув Alt-.)? Чи опублікуєте, будь ласка, посилання на нього?
edmz

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

2
Також Ctl-UpArrow (або AltUpArrow на bash) буде прокручуватися назад по списку історії. Набравши кілька символів, тоді UpArrow отримує лише команди, починаючи з цієї літери, наприклад, "fr (Ctl-Up)" прокручує всі команди "безкоштовно ..." у списку 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

@kasperd: Так, можна. багато відповідей на себе вказує: ctrl-s для пошуку вперед.
Олів'є Дулак

На жаль, ctrl-s використовується для заморозки терміналу, і bash не відключає це, так що не працює в конфігурації за замовчуванням. (Інші програми - наприклад, emacs - відключають прив'язку клавіш до заморожування терміналу, щоб ctrl-s можна було використовувати для пошуку.)
kasperd

@kasperd: Так, вибачте за те, що не згадували про це раніше (я вказав "багато відповідей", тому що вони точно це роблять, але я не знадобив часу, щоб набрати це в коментарі або дати посилання ... (я використовував свою Тепер я повернувся додому і міг би відредагувати це у відповіді вище. ctrl-s для пошуку історії башів потребує вас до stty -ixon спершу
Олів'є Дулак

Ця команда порушить звичайне використання ctrl-s, тому це насправді не варіант.
kasperd

7

Ви можете використовувати оболонку, вбудовану fc :

fc -s 636

2
Це насправді краще, ніж прийнята відповідь, але -sдля отримання переваг вам доведеться зняти . Якщо ви запустите, fc 636ви відкриєте редактор з командою 636 з вашої історії в буфері, і коли ви збережете та вийдете, команда (змінена чи ні) буде запущена. А ще краще, цей сумісний з POSIX .
Wildcard

@StevenPenny Дякую І так, я знаю, що таке POSIX, хоча я не бачу доречності. Незважаючи на це, було б непогано отримати доступ до деякої документації, яку легко отримати та включити.
Faheem Mitha

@FaheemMitha спробуйте виконати "help fc."
Wildcard

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

@Wildcard Дякую Я схильний забувати, що helpіснує. Ще одна вбудована оболонка. І дивовижне для необережних користувачів, які, можливо, хочуть допомогти з новою системою, але натомість стикаються з потоком гнучкості. :-(
Faheem Mitha

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.