Используя историю 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

Я бы предложил вместо использования команды истории использовать ctrl+r и начать вводить эту команду. Когда вы нажимаете клавишу со стрелкой, как если бы собирались его изменить, он перестанет распознаваться автозаполнением и позволит вам редактировать перед запуском.

ОБНОВЛЕНИЕ: также, если вы хотите циклически перебирать различные команды, содержащие только что набранную вами строку, продолжайте нажимать ctrl+r

Микель
источник
8
Если вы используете vi keybindings ( set -o vi), вы также можете использовать его /для поиска в истории и ее редактирования.
Уильям Перселл
1
Более мощная функция позволяет вводить частичную команду или часть пути, который был в команде, а затем использовать стрелки для навигации по истории. Поиск вариантов по истории-поиск-назад, по истории-вперед-вперед для bash
DavidC
2
DavidC, я видел, как это делают другие, но у меня это не работает. Когда я набираю первые несколько букв команды, затем нажимаю стрелку вверх, она игнорирует то, что я набирал, и просматривает историю, как будто я вообще ничего не набирал (от самых новых до самых старых). Как настроить оболочку для этого?
Daniel Watrous
1
Печально, что с помощью кнопок вверх / вниз не пролистываются совпадения, а сразу выходит из поиска. Я бы предпочел, чтобы он прокручивал совпадения с помощью кнопок вверх / вниз (что указывает на то, что я все еще ищу нужную команду) и имел только левый / правый выход из поиска (указывая, что я нашел нужную команду и теперь я готов его редактировать).
ADTC
3
@ADTC Я только что нашел способ делать то, что вы (и я) хотите: нажмите ctr+r, начните вводить, затем, когда вы захотите найти все команды, которые это содержат, просто продолжайте нажимать ctrl+r. Другими словами, то, что вы хотите делать с подъемом / опусканием, выполняется (по круговой системе) сctrl+r
Miquel
61

Фактически, вы можете просто добавить :pк команде, чтобы распечатать ее, не выполняя ее. Например:

$ ls -la
$ !!:p

Будет распечатана ls -laкак предыдущая команда, не выполняя ее, и вы можете просто нажать (вверх), чтобы найти и отредактировать.

Вы также можете сделать

!123:p

чтобы распечатать 123-ю команду в качестве предыдущей.

Joeschmidt45
источник
2
+1 Лучший ответ, так как это позволяет обычные команды истории , чтобы ответить на OP: !mycmd:p. Если в Bash включены команды vi, то ответ Перселла будет таким же хорошим или лучше. Ctrl-r, как упомянул Микель, является следующим лучшим вариантом.
Brent Faust
Если 123 не в начале строки, вы можете сделать:!? 123?: P
Udi
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".
янк-последний-аргумент (M-., M-_)
    Вставьте последний аргумент предыдущей команды (последнее слово предыдущей записи в истории). С аргументом ведите себя точно так же, как yank-nth-arg. Последовательные вызовы yank-last-arg перемещают назад по списку истории, вставляя по очереди последний аргумент каждой строки. Средства расширения истории используются для извлечения последнего аргумента, как если бы было указано расширение истории "! $".
линия расширения оболочки (MCe)
    Растяните строку, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слов оболочки. См. РАСШИРЕНИЕ ИСТОРИИ ниже для описания расширения истории.
история-развернуть-строку (M- ^)
    Выполнить раскрытие истории в текущей строке. См. РАСШИРЕНИЕ ИСТОРИИ ниже для описания расширения истории.
вставить последний аргумент (M-., M-_)
    Синоним слова yank-last-arg. 
работай и получай следующий (Co)
    Принять текущую строку для выполнения и выбрать следующую строку относительно текущей строки из истории для редактирования. Любой аргумент игнорируется.
редактировать-и-выполнить-команду (C-xC-e)
    Вызвать редактор в текущей командной строке и выполнить результат как команды оболочки.
Принц Джон Уэсли
источник
11
!123:gs/old/new/

Запустит команду 123, заменив строку 'old' на строку 'new'.

Джон Лоуренс
источник
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.

Tgr
источник
3

Вы также можете поставить

shopt -s histverify

в вашем .bash_profile, что приводит к тому, что любое расширение истории появляется в вашей командной строке без его запуска, что позволяет редактировать перед этим.

Чепнер
источник
1

Вы можете попробовать «ящик подсказок» - вроде истории https://github.com/dvorka/hstr - он читает историю Bash и позволяет быстро перемещаться.

чч

Чтобы получить последнюю команду, просто введите hh, перейдите к команде и используйте стрелку вправо, чтобы получить ее в командной строке (где вы можете отредактировать ее и / или добавить комментарий).

Мартин Дворак
источник
0

^ p, чтобы получить последнюю набранную команду в unix / solaris

СудхакарМ
источник
0

Положить

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

в вашем .bashrc(домашнем каталоге ), вы можете просто ввести

r <whatever>

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

чак
источник