Чи можна шукати історію в bash і запускати результат?
Чи можна шукати історію в bash і запускати результат?
Відповіді:
Наберіть 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
і history
man.
Ви також можете вказати відносні негативні компенсації під час використання !
позначення, тому, використовуючи наш список історії вище, якщо ми хотіли виконати vim
ще раз, ми могли б зробити:
$! -2
Що в основному говорить bash для виконання команди, яку ви виконали "дві команди тому". Щоб запустити попередню команду в списку історії, ми можемо просто скористатися !!
(для чого це просто скорочення !-1
).
!
Цілевказувач не обмежує вас чисельно задає , яку команду для запуску. hayalci показав, що ви можете доручити bash
виконувати команду на основі тексту, який він починає (використовуючи !
), або тексту в межах самої команди (використовуючи !?
). Знову ж, використовуючи наш список прикладів історії вище, якщо ми хотіли виконати clear
ще раз, все, що нам потрібно зробити, це набрати:
$! кл
і натисніть Enter. А про що vim
? Це так просто, як:
$!? деякі
Найважливішим моментом у відповіді hayalci є заклик до shopt
вбудованого:
$ shopt -s histverify
Це дозволить історію перевірки так , що команди , які підкріплювалися !
, !!
і !?
десігнаторамі не сліпо виконується, але замість цього заповнені в командному рядку , так що ви можете гарантувати , що вони не будуть робити ніякого зла , перш ніж виконати їх. Це ще важливіше, коли ви виконуєте команди як користувач root. Цю опцію можна встановити у вашому .bashrc
запусковому файлі так, що вона встановлюється кожного разу, коли ви входите в систему.
Як уже зазначалося, всю цю інформацію можна отримати зі bash
сторінки "man" . Для!, !!, і!? дизайнерів, погляньте на Розділ 9.3 Розширення історії .
shopt
йде у bashrc, а не bash_profile (або він не буде включений для оболонок, які не мають оболонок для входу).
Як альтернативу crtl+R, ви можете шукати історію, ввівши
!text
Тут буде здійснено пошук в історії найсвіжішої команди, що починається з «тексту».
Але я пропоную вам покласти це у свій .bashrc, щоб запобігти виконанню неправильної команди.
shopt -s histverify
Це вказує bash таким чином, що після будь-яких дій з історії (наприклад !!:s/prev_text/after_text
) він розміщує отриманий рядок у командному рядку. Потім ви можете переглянути або відредагувати команду, а потім натисніть Enter.
Я вважаю за краще використовувати історію-пошук-назад над зворотним-пошуком-історією. Перший дозволяє набрати кілька символів команди, потім натиснути клавішу пошуку, на відміну від натискання клавіші пошуку, а потім введення рядка пошуку.
За замовчуванням у моїй системі Mp і Mn прив'язуються до подібних функцій, але я віддаю перевагу прив’язуванню клавіш зі стрілками:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
У мене справді чудовий псевдонім, год. Це дійсно просто "історія | grep", але я фільтрую попередні записи "h команд" за допомогою "grep -E -v"
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
використовується як
h aliases
2003 less .bash_aliases
HISTIGNORE
.
Відмінний запис, Шон! Я ставлю це до коментаря, але я соромлюсь декількох репутаційних пунктів. :-)
Інший пов'язаний і корисний прийом - це можливість запускати попередню команду під час зміни слова. Скажіть, що ви ввели ім'я каталогу або хочете змінити ім'я файлу:
$ echo мене звуть bob мене звуть боб $ ^ bob ^ jordan відлуння мене звуть Йордан мене звуть Йордан
Зауважте, що команду розгортають, замінюють та виводять перед запуском команди, тому якщо запускається неправильна команда, ви можете побачити, що баш думав, що це робить.
Оскільки навігація по історії за допомогою Ctrl-r є IMO громіздкою, ви можете розглянути hh :
https://github.com/dvorka/hstr
що робить навігацію набагато простішою, простішою та ефективнішою - включаючи виконання команди:
ctrl + r
за замовчуванням пов'язується
У командному рядку bash введіть control-R, а потім введіть кілька символів потрібної команди, а засіб для читання bash здійснить пошук за історією команд для цієї команди.
Після того, як ви розпочали пошук, ви можете знову ввести control-R, щоб перейти до наступної збіжної команди.
Якщо у вас оболонка налаштована на використання vi
прив'язки ключів ( set -o vi
або set editing-mode vi
у вас є $HOME/.inputrc
), ви здійснюєте пошук <Esc>/some-command<Return>
та натискання n
(наступний) або Shift-n
(попередній) для переходу по історії командного рядка.
Мені подобається 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 оновлює результати