Використовуючи історію Bash, щоб отримати попередню команду, скопіюйте її, а потім "запустіть", але з коментарем команди


79

Просто питання для вдосконалення моїх bashнавичок. Я завжди роблю це:

$ history | grep some_long_command

...
...
123 some_long_command1.........
124 some_long_command2.........
...

Потім я можу запустити команду, яку я знайшов, виконавши:

!123

Однак я часто хочу зробити це:

some_long_command1foobar

Тобто змініть команду перед тим, як її запустити. Чи можете ви використовувати bash для запуску цієї команди:

#some_long_command1

так це коментується.

Тоді мені не потрібно за допомогою миші виділяти команду, редагувати її, а потім запускати (я можу просто використовувати клавіатуру - швидше).

Я припускаю, що я міг би написати сценарій для цього, але, можливо, десь там вже вбудована функціональність ....?


6
Найпростіший спосіб: ввести bind Space:magic-spaceсвій профіль bash. Потім натискання Spaceрозшириться !123на some_long_command1.
Blaz

@courteous: Дякую! Цей був для мене новим. Дуже корисний.
marlar

Відповіді:


140

Я б запропонував замість того, щоб використовувати команду history, яку ви використовуєте ctrl+r та починаєте вводити цю команду. Коли ви натискаєте клавішу зі стрілкою, ніби хочете її змінити, вона випаде з розпізнавання автозавершення та дозволить вам редагувати перед запуском.

ОНОВЛЕННЯ: також, якщо ви хочете переглядати різні команди, що містять рядок, яку ви щойно ввели, продовжуйте натискати ctrl+r


8
Якщо ви використовуєте прив'язки клавіш vi ( set -o vi), ви також можете використовувати /для пошуку в історії та її редагування.
Вільям Перселл,

1
Більш потужна функція дозволяє вводити часткову команду або частину шляху, який був у команді, а потім використовувати стрілки для навігації в історії. Шукати варіанти історії пошуку назад, історії пошуку вперед для bash
DavidC

2
DavidC, я бачив, як це роблять інші, але це не працює для мене. Коли я вводжу перші кілька літер команди, тоді я натискаю стрілку вгору, вона ігнорує те, що я вводив, і проходить історію так, ніби я взагалі нічого не вводив (від найновішої до найстарішої). Як ви налаштовуєте свою оболонку для цього?
Даніель Вотрус,

1
Сумно, що вгору / вниз не прокручують сірники, а негайно виходять із пошуку. Я хотів би, щоб він прокручував матчі вгору / вниз (вказуючи на те, що я все ще шукаю потрібну команду), і мав би лише лівий / правий вихід з пошуку (вказуючи, що я знайшов потрібну команду і тепер я готовий його редагувати).
ADTC 10.03.14

3
@ADTC Я щойно знайшов спосіб зробити те, що ти (і я хочу): натиснути ctr+r, почати вводити текст, потім, коли ти хочеш знайти всі команди, що містять це, просто продовжуй натискати ctrl+r. Іншими словами, те, що ви хочете зробити з «вгору / вниз», робиться (круглим способом) за допомогоюctrl+r
Мікель

61

Насправді, ви можете просто додати :pкоманду, щоб надрукувати її, не виконавши її. Наприклад:

$ ls -la
$ !!:p

Буде роздруковано ls -laяк попередня команда, не запускаючи її, і ви можете просто натиснути (вгору), щоб знайти її та відредагувати.

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

!123:p

щоб роздрукувати 123-ю команду як попередню.


2
+1 Найкращою відповіддю, так як це дозволяє звичайні команди історії , щоб відповісти на OP: !mycmd:p. Якщо у вас увімкнено команди vi в Bash, то відповідь Перселла так само хороша чи краща. Ctrl-r, як згадував Мікель, наступний найкращий.
Brent Faust

Якщо 123 не на початку рядка, ви можете зробити:!? 123?: P
Уді

19

Ви також можете спробувати fcкоманду для редагування команди в історії.

WIKI каже,

Ь стандартну програма Unix , що списки або редагують і повторно виконує , команди , раніше внесені в інтерактивну оболонку. fc - це вбудована команда в оболонці bash ; help fc покаже інформацію про використання.


Окрім зворотного інкрементного пошуку ( Ctrl+ R), у нас є ще кілька комбінацій клавіш bash :

Від man bash:

попередня історія (Cp)
    Виберіть попередню команду зі списку історії, повертаючись назад у списку. 
наступна історія (Cn)
    Виберіть наступну команду зі списку історії, рухаючись вперед у списку. 
початок історії (M- <)
    Перехід до першого рядка в історії. 
кінець історії (M->)
    Перейти до кінця історії введення, тобто рядка, який вводиться в даний момент. 
історія зворотного пошуку (Cr)
    Шукайте назад, починаючи з поточного рядка і рухаючись вгору по історії, якщо потрібно. Це покроковий пошук.
історія пошуку вперед (Cs)
    Шукайте вперед, починаючи з поточного рядка і рухаючись «вниз» по історії за необхідності. Це покроковий пошук.
історія неінкрементного зворотного пошуку (Мп)
    Шукати назад по історії, починаючи з поточного рядка, використовуючи неінкрементний пошук рядка, наданого користувачем. 
неінкрементальна історія пошуку вперед (Mn)
    Шукати вперед по історії, використовуючи неінкрементний пошук рядка, наданого користувачем.
yank-nth-arg (MCy)
    Вставте перший аргумент до попередньої команди (як правило, друге слово в попередньому рядку) в точці. З аргументом n вставте n-те слово з попередньої команди (слова в попередній команді починаються зі слова 0). Негативний аргумент вставляє n-те слово з кінця попередньої команди. Після обчислення аргументу n аргумент витягується так, ніби було вказано розширення історії "! N".
yank-last-arg (M-., M-_)
    Вставте останній аргумент до попередньої команди (останнє слово попереднього запису історії). З аргументом поводьтеся точно так само, як yank-nth-arg. Послідовні виклики yank-last-arg рухаються назад по списку історії, вставляючи по черзі останній аргумент кожного рядка. Засоби розширення історії використовуються для вилучення останнього аргументу, ніби було вказано розширення історії "! $".
лінія розширення оболонки (MCe)
    Розгорніть рядок так, як робить оболонка. Це виконує розширення псевдонімів та історії, а також усі розширення слів оболонки. Див. ІСТОРІЙНЕ РОЗШИРЕННЯ нижче для опису розширення історії.
рядок розширення історії (M- ^)
    Виконайте розширення історії на поточному рядку. Див. ІСТОРІЙНЕ РОЗШИРЕННЯ нижче для опису розширення історії.
insert-last-argument (M-., M-_)
    Синонім yank-last-arg. 
оперувати і отримувати наступного (Co)
    Прийміть поточний рядок для виконання та дістаньте наступний рядок відносно поточного рядка з історії для редагування. Будь-який аргумент ігнорується.
команда редагування та виконання (C-xC-e)
    Викличте редактор у поточному командному рядку та виконайте результат як команди оболонки.


6

Ви можете перейти до режиму редагування, натиснувши M- ^ (option-shift-6 на mac).

Введіть це:

! 123M- ^

І ви будете редагувати команду № 123. Це як би використання ctrl-r, але починаючи з синтаксису оклику.


Можна M-^повторно прив’язати до чогось більш зручного для пальців?
Blaz

4

Замість того, щоб використовувати historyкоманду, прив'яжіть history-search-backward/ history-search-forwardдо ярликів клавіш, які можна легко запам'ятати (я віддаю перевагу PgUp / PgDown). Для цього вставте це у свій .inputrcфайл:

"<key code>":  history-search-backward
"<key code>":  history-search-forward

Щоб отримати <key code>, введіть Ctrl-V <key>оболонку та замініть стартову ^[на\e в будь-якому відображалося.

Після того, як це налаштовано, ви можете просто ввести someі натиснути PgUp, щоб отримати some_long_command. Якщо вам потрібно, some_long_command with_some_argале є подібна команда some_long_command with_some_other_argпізніше в історії, ви можете прокручувати, поки не дійдете до неї, набравши, someа потім натискаючи PgUp кілька разів, або ви можете ввести some, натиснути PgUp, перемістити курсор туди, де обидві команди починають відрізнятися, введіть кілька символів і ще раз натисніть PgUp. Ця здатність швидко перебирати / диференціювати подібні команди робить його, на мій погляд, набагато зручнішим інструментом, ніж Ctrl-R.


3

Можна також поставити

shopt -s histverify

у вашому .bash_profile, що призводить до появи будь-якого розширення історії у вашому командному рядку без його запуску, що дозволяє вам редагувати перед цим.


1

Ви можете спробувати спробувати історію, схожу на "поле для пропозицій" https://github.com/dvorka/hstr - вона читає історію Bash і забезпечує швидку навігацію.

hh

Щоб отримати останню команду, просто введіть hh, перейдіть до команди та використовуйте стрілку вправо, щоб отримати її в командному рядку (де ви можете її редагувати та / або додати коментар).



0

Покласти

псевдонім r = 'fc -s'

у вашому .bashrc(домашньому каталозі), тоді ви можете просто ввести

r <whatever>

в командному рядку, і ви виконаєте копію останньої <whatever>команди (тих самих параметрів), яка є у вашій історії. просто натисніть стрілку вгору, щоб побачити, що ви виконали, якщо відчуваєте потребу.

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