Используя bash history, чтобы получить предыдущую команду, скопируйте ее и затем «запустите», но с комментированной командой

Просто вопрос, чтобы улучшить мои навыки bash. Я всегда так делаю:

$ history | grep some_long_command

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

Затем я могу выполнить команду, найденную мной, выполнив:

!123

Однако я часто хочу сделать это:

some_long_command1foobar

т.е. измените команду, прежде чем я ее запущу. Можете ли вы использовать bash вместо этой команды:

#some_long_command1

так что это комментируется.

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

Полагаю, я мог бы написать скрипт для этого, но где-то уже может быть встроена функциональность ....?

Спасибо.

77 голосов | спросил ale 12 J0000006Europe/Moscow 2012, 20:01:34

10 ответов


0

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

UPDATE: также, если вы хотите переключаться между различными командами, которые содержат только что набранную строку, продолжайте нажимать ctrl+r

ответил Miquel 12 J0000006Europe/Moscow 2012, 20:03:51
0

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

$ ls -la
$ !!:p

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

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

!123:p

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

ответил joeschmidt45 20 J0000006Europe/Moscow 2012, 21:12:12
0

Вы также можете попробовать команду fc , чтобы изменить команду в истории.

WIKI сообщает,

  

fc - это стандартная программа для Unix, которая перечисляет, редактирует и выполняет заново,   Команды, ранее введенные в интерактивную оболочку. fc - это встроенный   команда в оболочке bash ; help fc покажет информацию об использовании.


Помимо обратного инкрементального поиска ( Ctrl + R ), у нас есть еще несколько ярлыков bash :

Из man bash:

 предыдущая история (C-p) 
    Получить предыдущую команду из списка истории, вернувшись назад в список.
 следующая история (C-n) 
    Получить следующую команду из списка истории, двигаясь вперед в списке.
 начало истории (M & lt) 
    Перейти к первой строчке в истории.
 конец истории (M->) 
    Перейти к концу истории ввода, то есть к строке, которая вводится в данный момент.
 история обратного поиска (C-r) 
    Выполняйте поиск в обратном направлении, начиная с текущей строки и перемещаясь по истории вверх по мере необходимости. Это пошаговый поиск.
 история поисковых запросов (C-s) 
    Поиск вперед, начиная с текущей строки и двигаясь вниз по истории по мере необходимости. Это пошаговый поиск.
 non-incremental-reverse-search-history (M-p) 
    Выполните поиск в обратном направлении по истории, начиная с текущей строки, используя неинкрементный поиск строки, предоставленной пользователем.
 non-incremental-forward-search-history (M-n) 
    Поиск вперед по истории, используя неинкрементный поиск строки, предоставленной пользователем.
 янки-н-арг (M-C-y) 
    Вставьте первый аргумент в предыдущую команду (обычно второе слово в предыдущей строке) в точке. С аргументом n вставьте n-е слово из предыдущей команды (слова в предыдущей команде начинаются со слова 0). Отрицательный аргумент вставляет n-е слово в конце предыдущей команды. Как только аргумент n вычислен, аргумент извлекается, как если бы было указано расширение истории "! N".
 yank-last-arg (M-., M -_) 
    Вставьте последний аргумент в предыдущую команду (последнее слово предыдущей записи в истории). С аргументом ведите себя точно так же, как yank-nth-arg. Последовательные вызовы yank-last-arg перемещаются назад по списку истории, вставляя последний аргумент каждой строки по очереди. Средства расширения истории используются для извлечения последнего аргумента, как если бы было указано расширение истории "! $".
 shell-expand-line (M-C-e) 
    Разверните строку, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слов оболочки. См. РАСШИРЕНИЕ ИСТОРИИ ниже для описания расширения истории.
 история-расширение-строка (M - ^) 
    Выполните расширение истории на текущей строке. См. РАСШИРЕНИЕ ИСТОРИИ ниже для описания расширения истории.
 insert-last-аргумент (M-., M -_) 
    Синоним для yank-last-arg.
 оперируй и получай дальше (C-o) 
    Принять текущую строку для выполнения и извлечь следующую строку относительно текущей строки из истории для редактирования. Любой аргумент игнорируется.
 команда редактирования и выполнения (C-xC-e) 
    Вызвать редактор в текущей командной строке и выполнить результат как команды оболочки.
ответил Prince John Wesley 12 J0000006Europe/Moscow 2012, 20:32:54
0
!123:gs/old/new/

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

ответил John Lawrence 12 J0000006Europe/Moscow 2012, 20:07:21
0

Вы можете перейти в режим редактирования, нажав M- ^ (option-shift-6 на Mac).

Введите это:

  

123М - ^

И вы будете редактировать команду # 123. Это похоже на использование ctrl-r, но начинается с синтаксиса восклицательного знака.

ответил James Moore 12 FebruaryEurope/MoscowbTue, 12 Feb 2013 02:44:19 +0400000000amTue, 12 Feb 2013 02:44:19 +040013 2013, 02:44:19
0

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

shopt -s histverify

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

ответил chepner 12 J0000006Europe/Moscow 2012, 20:15:52
0

Вместо использования команды 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 20 FebruaryEurope/MoscowbWed, 20 Feb 2013 19:17:36 +0400000000pmWed, 20 Feb 2013 19:17:36 +040013 2013, 19:17:36
0

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

hh

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

ответил Martin Dvorak 10 Jam1000000amFri, 10 Jan 2014 04:18:31 +040014 2014, 04:18:31
0

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

ответил SudhakarM 11 FebruaryEurope/MoscowbTue, 11 Feb 2014 18:15:42 +0400000000pmTue, 11 Feb 2014 18:15:42 +040014 2014, 18:15:42
0

Помещенный

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

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

r <whatever>

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

ответил chuck 27 72016vEurope/Moscow11bEurope/MoscowSun, 27 Nov 2016 22:47:07 +0300 2016, 22:47:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132