Як я можу шукати історію башів і повторно виконувати команду?


Відповіді:


428

Наберіть Ctrl Rв командному рядку і почніть вводити попередню команду. Після появи результату продовжуйте натискати, Ctrl Rщоб побачити інші матчі. Коли з'явиться потрібна команда, просто натиснітьEnter

Зауважте, що час Ctrl Rза замовчуванням, якщо ви хочете, щоб команда ( reverse-search-history) була прив’язана до Ctrl Tвас, ви могли налаштувати це з наступним:

прив’язати "" \ Ct ": історія зворотного пошуку"

Існує ціла низка інших команд, що зшивають читання, які також доступні вам. Погляньте на сторінку bashчоловіка .

Bash має багато засобів для пошуку та доступу до інтерактивної історії команд. Найголовніший з яких - historyвбудований. Введення просто:

$ історія

Друкує список команд разом із числовим індексом, наприклад:

$ історія
1 ясно
2 лс -ал
3 vim ~ / somefile.txt
4 історія
$

Потім можна виконати будь-яку з цих команд, використовуючи їх числовий індекс, попередньо встановивши індекс єдиним !, як Мітч вказував:

$! 1

Виконує clearкоманду. Вбудована історія має багато можливостей, ви можете побачити більше на сторінках bashі historyman.

Ви також можете вказати відносні негативні компенсації під час використання !позначення, тому, використовуючи наш список історії вище, якщо ми хотіли виконати vimще раз, ми могли б зробити:

$! -2

Що в основному говорить bash для виконання команди, яку ви виконали "дві команди тому". Щоб запустити попередню команду в списку історії, ми можемо просто скористатися !!(для чого це просто скорочення !-1).

!Цілевказувач не обмежує вас чисельно задає , яку команду для запуску. hayalci показав, що ви можете доручити bashвиконувати команду на основі тексту, який він починає (використовуючи !), або тексту в межах самої команди (використовуючи !?). Знову ж, використовуючи наш список прикладів історії вище, якщо ми хотіли виконати clearще раз, все, що нам потрібно зробити, це набрати:

$! кл

і натисніть Enter. А про що vim? Це так просто, як:

$!? деякі

Найважливішим моментом у відповіді hayalci є заклик до shoptвбудованого:

$ shopt -s histverify

Це дозволить історію перевірки так , що команди , які підкріплювалися !, !!і !?десігнаторамі не сліпо виконується, але замість цього заповнені в командному рядку , так що ви можете гарантувати , що вони не будуть робити ніякого зла , перш ніж виконати їх. Це ще важливіше, коли ви виконуєте команди як користувач root. Цю опцію можна встановити у вашому .bashrcзапусковому файлі так, що вона встановлюється кожного разу, коли ви входите в систему.

Як уже зазначалося, всю цю інформацію можна отримати зі bashсторінки "man" . Для!, !!, і!? дизайнерів, погляньте на Розділ 9.3 Розширення історії .


39
+1 Я вже більше 12 років використовую Linux для всіх систем. Я не знав, що існує. Побажав, що я міг +10, як я пропустив його ??
Ейден Белл

1
У багатьох системах натискання стрілки вгору робить те саме.
мас

Якби хтось консолідував '!', '!!', '!?', 'Історію | grep 'та' ctrl-r 'у вичерпну відповідь, я вибрав би її
Річард Хоскінс

shoptйде у bashrc, а не bash_profile (або він не буде включений для оболонок, які не мають оболонок для входу).
Тобу

2
Також після натискання CTRL + R ви можете використовувати CTRL + SHIFT + R кілька разів, щоб повернутися до попередньої команди
Gal Bracha

37

Як альтернативу crtl+R, ви можете шукати історію, ввівши

!text

Тут буде здійснено пошук в історії найсвіжішої команди, що починається з «тексту».

Але я пропоную вам покласти це у свій .bashrc, щоб запобігти виконанню неправильної команди.

shopt -s histverify

Це вказує bash таким чином, що після будь-яких дій з історії (наприклад !!:s/prev_text/after_text) він розміщує отриманий рядок у командному рядку. Потім ви можете переглянути або відредагувати команду, а потім натисніть Enter.


5
Використовуйте !? text для повторного виконання останньої команди, що містить (на відміну від початку) "текст".
mark4o

3
Якби хтось консолідував '!', '!!', '!?', 'Історію | grep 'і' ctrl-r 'у вичерпну відповідь, я б вибрав її.
Річард Хоскінс

32

Ви також можете зробити:

history | grep "stuff"

це поверне щось подібне

num stuff

тоді ви можете набрати

!num

15

Я вважаю за краще використовувати історію-пошук-назад над зворотним-пошуком-історією. Перший дозволяє набрати кілька символів команди, потім натиснути клавішу пошуку, на відміну від натискання клавіші пошуку, а потім введення рядка пошуку.

За замовчуванням у моїй системі Mp і Mn прив'язуються до подібних функцій, але я віддаю перевагу прив’язуванню клавіш зі стрілками:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'

13

У мене справді чудовий псевдонім, год. Це дійсно просто "історія | grep", але я фільтрую попередні записи "h команд" за допомогою "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

використовується як

h aliases
2003  less .bash_aliases

1
Це також можна досягти, додавши команду до HISTIGNORE.
таненбрінг

12

Відмінний запис, Шон! Я ставлю це до коментаря, але я соромлюсь декількох репутаційних пунктів. :-)

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

$ echo мене звуть bob
мене звуть боб
$ ^ bob ^ jordan
відлуння мене звуть Йордан
мене звуть Йордан

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


6

Оскільки навігація по історії за допомогою Ctrl-r є IMO громіздкою, ви можете розглянути hh :

https://github.com/dvorka/hstr

що робить навігацію набагато простішою, простішою та ефективнішою - включаючи виконання команди:

введіть тут опис зображення


Як ним користуватися? Які клавіші натиснути, щоб побачити цю картинку?
Накілон

2
Після встановлення hh ви можете використовувати команду hh АБО прив’язати її до будь-якого ярлика клавіатури (як правило, Ctrl-r), як описано в документації.
Мартін Дворак

тепер він ctrl + rза замовчуванням пов'язується
Аллео

4

У командному рядку bash введіть control-R, а потім введіть кілька символів потрібної команди, а засіб для читання bash здійснить пошук за історією команд для цієї команди.

Після того, як ви розпочали пошук, ви можете знову ввести control-R, щоб перейти до наступної збіжної команди.


3

Якщо у вас оболонка налаштована на використання viприв'язки ключів ( set -o viабо set editing-mode viу вас є $HOME/.inputrc), ви здійснюєте пошук <Esc>/some-command<Return>та натискання n(наступний) або Shift-n(попередній) для переходу по історії командного рядка.


Цей найближчий до користувачів vim.
Габор Мартон

2

CTRL+ Rпрацює чудово, як, наприклад, запропонував @ John1024, але є дещо стомлюючим, якщо багато ваших останніх команд схожі, і ви хочете швидкий спосіб їх сканування. Альтернативою було б використання history:

$ history | grep keyword

0

Мені подобається HSTR, але я, здається, іноді не можу його встановити. Тож я написав псевдонім за допомогою fzf, який імітує його поведінку ( hxдля "виконувати історію")

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : ну дістань історію
  • sed : видаліть числовий стовпець зі списку (POSIX)
  • fzf: ось магія, дозволяє нечітко шукати список в інтерактивному режимі або рухатися за допомогою, C-Jа C-Kпотім виконувати команду за допомогою Enter.
  • --height : встановлення кількості показаних рядків
  • --tac : повернути список (більш логічно для історії)
  • --tiebreak=index : зберігайте порядок історії, коли fzf оновлює результати
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.