Шукайте попередню команду з префіксом, який я щойно набрав


67

Ми можемо використовувати стрілку вгору та вниз для навігації по історії команд.

У деяких IDE, таких як Matlab, якщо ми щось вводимо, а потім натискаємо клавіші зі стрілками, ми прокручуємо лише команди історії, починаючи з того, що ми вводимо. Це дійсно зручно, але в терміналі оболонки це не працює.

Чи є спосіб отримати подібну функцію в терміналі оболонки? І будь-які інші поради щодо підвищення ефективності використання терміналів?


Ви можете просто скористатися оболонкою, яка забезпечує таку функцію, як fish;)
yoann

@yoann ви припускаєте, що баш не робить. За допомогою функції "readline" це не доступно за замовчуванням.
муру

@muru Я знаю CTRL + R в баші, і відповідь egmont забезпечує чіткий спосіб зробити це з Page Up / Page Down. Однак існує спосіб зробити це за допомогою клавіш зі стрілками?
yoann

1
@yoann перевірити unix.stackexchange.com/a/76591/70524 . Замість того , \e[5~і \e[6~, використання \e[A, \e[B.
муру

Відповіді:


95

Що ви шукаєте, так і є CtrlR.

Введіть CtrlRта введіть частину потрібної команди. Bash відобразить першу відповідну команду. Продовжуйте вводити текст CtrlRі bash буде переходити за допомогою попередніх відповідних команд.

Для пошуку назад в історії введіть CtrlSзамість цього. (Якщо CtrlSце не працює для вас таким чином, це, ймовірно, означає, що вам потрібно відключити контроль потоку XON / XOFF: щоб зробити це, запустіть stty -ixon.)

Це задокументовано в розділі "Пошук" в man bash.


1
Ctrl-Qщоб вийти з замороженого стану, якщо ви вже натиснули, Ctrl-Sне вимкнувши спочатку контроль потоку, і ваш термінал заморожений.
HongboZhu

26

Розмістіть їх у своїх ~/.inputrc:

"\e[5~": history-search-backward
"\e[6~": history-search-forward

Вони роблять Page Upі Page Downповодяться так, як ви хочете. (Деякі дистрибутиви вже налаштували його для вас.) Я особисто вважаю цей спосіб зручнішим, ніж Ctrl+ Rабо history.


Це найзручніший спосіб у всіх поточних відповідях. Не могли б у плз дати невелике пояснення робочому механізму?
Лі

3
~/.inputrcабо /etc/inputrcабо файл, на який посилається змінна середовище, $INPUTRC- це файл конфігурації редагування рядків для всієї програми, що використовує readline, включаючи bash (вашу оболонку). У ньому є певні вбудовані можливості редагування рядків, включаючи ці два: у ручній сторінці Bash шукайте одне з цих ключових слів, щоб дізнатися більше. \e[5~/ \e[6~- послідовності виходу, згенеровані клавішами Page Up / Down в більшості емуляторів терміналу; щоб побачити це, запустіть catкоманду та натисніть ці клавіші (байт втечі представлений у терміналі як ^[, в inputrc як \e).
Егмонт

Приклад у вашому первісному запитанні говорить про те, що клавіші вгору / вниз працюють таким чином у Matlab. Було б цікаво подивитися, що сталося, якщо ви помістили послідовність вгору та вниз у inputrc і призначили цю дію; чи буде вона працювати правильно, чи матиме неприємні побічні ефекти, оскільки це суперечить їх поведінці за замовчуванням. Я не знаю, я був би радий почути ваші висновки, якщо ви експериментуєте з цим.
Егмонт

Коли я echo $INPUTRCце роблю, він порожній. Я використовую Ubuntu 14.04
JorgeeFG

2
Я особисто вважаю за краще стрілки вгору та вниз робити це: "\e[A": history-search-backwardта"\e[B": history-search-forward
A.Wan

9

Окрім історії i-search з ^ r / ^:

alt.вставляє на курсор останнє "слово" попередньої команди. Повторіть це, щоб отримати останнє слово зі старих команд. (Але зауважте, що &останнє слово для фонових команд вважається проривом).

Це дуже зручно для mkdir foo, cdальт-крапка. Навіть швидше, ніж стрілка вгору, ^ a, alt-d (видалити слово вперед) cd,.

Для отримання другого до останнього слова використовуйте esc - 2 alt+.(тобто використовуйте числовий аргумент у стилі emacs alt+.. Від’ємне число рахується з кінця, позитивне враховується від початку.) Але це зазвичай більше клопоту, ніж варто; в якийсь момент швидше дотягнутись до миші та скопіювати / вставити, або стрілку вгору та ^ w / ^ y її частину (див. нижче).


Якщо ваш термінал налаштований добре / належним чином, ctrl-ліворуч і ctrl-праворуч перейдуть назад / вперед словами. Якщо ні, то, сподіваємось, принаймні alt-b і alt-f зроблять те саме.


ctrl- / - це скасування. Ви можете використовувати автоматичне повторення для видалення слів набагато ефективніше, якщо ви можете скасувати їх, коли трохи перевернете їх.


Більш потужне змішування / узгодження команд відбувається від використання kill-ring, яке працює так само, як і в Emacs. ctrl-y, щоб вставити останній ctrl-w / ctrl-u / ctrl-backspace / alt-d. alt-y, щоб перейти через старіший вбитий текст.

Кілька ctrl-w або що завгодно підряд вносять запис у програму kill-ring. Використовуйте стрілку вліво і вправо або щось, щоб розділити запис, якщо ви хочете видалити дві речі та вставити лише одну пізніше.

Поєднавши все це разом, ви можете

  • почніть вводити команду
  • ctrl-r, щоб повернутися до старої команди та захопити її частину за допомогою control-w або подібного.
  • esc-r або alt+rвідновити його таким, яким він був до того, як ви видалили його частину.
  • alt >- повернутися до кінця історії (тобто стрілка вниз до кінця), щоб повернутися до тієї команди, в якій ви опинилися в середині.

Інші поради щодо інтерактивного використання:

Увімкнути shopt -s globstar, так що ви можете зробити **/*.c(рекурсивна, включаючи поточний dir). Іноді зручно для інтерактивного використання, але зазвичай find -name '*.c' -exec foo {} +краще.

Якщо ви пишете bash-скрипти, вам буде зручно, щоб вони також були shopt -s extglobвключені у ваші інтерактивні оболонки. Ви іноді знаходите застосування для таких речей , як , *.!(c|h)щоб відповідати файлам , які не закінчуються на .c або .h.

Знайти псевдоніми ви любите для ls -l, lessі все , що ви робите багато. ( cp -i, mv -iі rm -Iє приємними. Не звичайте залежно від них робити вибіркові rm. GNU rm's - я прошу один раз для всіх аргументів.)

Мені подобається alias m=less(м для «більше»). Я lessстворив ,і .прив’язаний до попереднього / наступного файлу ( lesskey). За замовчуванням - це послідовність натискання декількох клавіш, яку не можна використовувати з автоматичним повторенням.


Мені подобається робити все на екрані GNU. Мені легше відслідковувати пронумеровані вікна, ніж навантаження вкладок у Konsole (або будь-який інший емулятор терміналу, який я пробував). Якщо ви ще не знаєте screen, вивчіть tmux, тому що він новіший і менш вибагливий.

Щоб отримати щось подібне до функціональності відкриття нової оболонки з тим же cwd, що й інша оболонка, я використовую спеціальний гак для cd / pushd / popd, який дозволяє мені робити cds 8диск на будь-який dir, який використовує моя оболонка у вікні 8 екрану. Це працює навіть для оболонок поза сеансом екрана, якщо існує лише один екранний сеанс.


Моя, здається, не "правильно налаштована". Багато ярликів, які я бачу тут, не працюють, я використовую Stock Terminal від Ubuntu 14.04. Як це можна налаштувати?
JorgeeFG

@JorgeeFG: Я думаю, що це працювало для мене з коробки gnome-terminalв Ubuntu 14.04, перш ніж я перейшов на KDE. Відповідна опція знаходиться в налаштуваннях вашого терміналу, префіксах esc vs high-bit і, можливо, деяких інших налаштуваннях. Деякі з них для мене не працюють ідеально. (Наприклад , Ctrl лівий / правий munge втечу-код для клавіші зі стрілкою, і я отримую 5Dз'являтися буквально)
Пітер Кордес

7

Додайте до свого рядка наступні рядки ~/.inputrc

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

Це схоже на відповідь egmont, але замість того, щоб використовувати Page Up і Page Down, вони використовують послідовності втечі для стрілок вгору та стрілок вниз. Цей спосіб набагато зручніше використовувати на Mac.


4

Я завжди схильний конфігурувати свої машини з великим значенням HISTSIZE, тому він зберігає довший список історії, а також HISTTIMEFORMAT зі значенням штампів часу, щоб я міг бачити, коли виконувалася команда.

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

Зазвичай я використовую засоби для комбінування historyкомандиgrep

IE:

history | grep <command im looking for>

Тут буде відображено нумеровану історію введених команд, які містять цю команду, ви можете використовувати:

!<number listed in history command>

щоб повторити цю команду.

IE:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

далі: !571

повториться history | grep history


1
CR = набагато краще + набагато безпечніше
PSkocik

1
Можливо, Особисто я вважаю, що історія, яка прошита до grep, є швидшим засобом пошуку більшості команд. Наскільки безпечніше, я не впевнений, що ви маєте на увазі, які властиві ризики використання історії, призначеної для пошуку через неї за допомогою cR?
Гравий

2
@ Gravy Я підозрюю, що PSkocik означає, що !заміна історії є менш безпечною.
дероберт

3
@Gravy Притаманні ризики випадково отримають неправильну лінію. Не маю уявлення, чому ваш термінал заморожений, якщо ви не використовували Control-S і не ввімкнено контроль потоку xon / xoff (часто за замовчуванням). Якщо так, Control-Q поверне його назад.
дероберт

1
Я погоджуюся з @PSkocik, cr набагато краще, тому що простіше редагувати рядок історії, а не просто запускати її знову тим же чином. Запуск точно тієї самої команди - тривіальний випадок того, що ви можете зробити, щоб заощадити час на повторне введення варіантів на складних однолінійках або заповнення вкладки іншого файлу за довгий шлях. Дивіться мою відповідь.
Пітер Кордес

1

Я щодня використовував 4 поради (та деякі інші) у своєму баш-терміналі:

  • Виконати останню команду: !!

  • Виконати команду N з історії: !N

  • Друк останньої команди, починаючи з префіксу з історії: !prefix:p

  • Виконати останню команду, починаючи з префіксу з історії: !prefix


1

Якщо для вас нормально використовувати zshзамість bashвас кону, використовуйте для цього oh-my-zsh .

Він містить стрілку вгору навігації по історії ваших команд. Це дозволяє також ту саму навігацію, коли ви вже ввели текст (як Mathlab).

редагувати. Він також містить інші матеріали, орієнтовані на розробників, такі як псевдоніми та теми. Ці екстри роблять дистрибутив більшим і складнішим у використанні.

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zshмістить тонни речей. Ви також можете сказати: Ця точна функція включена в цей дистрибутив, коли все, що вам потрібно, це певні налаштування або додаток.
муру

Я відредагував публікацію: попередив, що вона більша, ніж проста програма.
user9869932

1

Додайте наступний псевдонім до ~ / .bashrc

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

Використання: h fireотримає мені список команд, що містять вогонь . або h ^fireотримаю мені список команд, що починаються з вогню .

Це корисно, коли я хочу переглянути ряд команд одночасно.

До речі, '"'"'це некрасиво, але я не міг знайти інших способів уникнути одиничних лапок в одних цитатах.


фій - h="history | awk '{\$1=\"\"; print}'має працювати. альтернативно створити функцію і викликати її.
DarkHeart

дякую DarkHeart, але я спробував ваш код, виявив, що не працював у моєму середовищі, можливо, в моєму є щось інше
Hosi Golden
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.