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

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

$ history | grep some_long_command

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

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

!123

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

some_long_command1foobar

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

#some_long_command1

чтобы он прокомментировался.

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

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

Спасибо.

Ответ 1

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

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

Ответ 2

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

$ ls -la
$ !!:p

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

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

!123:p

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

Ответ 3

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

WIKI говорит,

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


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

От man bash:

previous-history (C-p)
    Fetch the previous command from the history list, moving back in the list. 
next-history (C-n)
    Fetch the next command from the history list, moving forward in the list. 
beginning-of-history (M-&lt)
    Move to the first line in the history. 
end-of-history (M->)
    Move to the end of the input history, i.e., the line currently being entered. 
reverse-search-history (C-r)
    Search backward starting at the current line and moving 'up' through the history as necessary. This is an incremental search. 
forward-search-history (C-s)
    Search forward starting at the current line and moving 'down' through the history as necessary. This is an incremental search. 
non-incremental-reverse-search-history (M-p)
    Search backward through the history starting at the current line using a non-incremental search for a string supplied by the user. 
non-incremental-forward-search-history (M-n)
    Search forward through the history using a non-incremental search for a string supplied by the user.
yank-nth-arg (M-C-y)
    Insert the first argument to the previous command (usually the second word on the previous line) at point. With an argument n, insert the nth word from the previous command (the words in the previous command begin with word 0). A negative argument inserts the nth word from the end of the previous command. Once the argument n is computed, the argument is extracted as if the "!n" history expansion had been specified.
yank-last-arg (M-., M-_)
    Insert the last argument to the previous command (the last word of the previous history entry). With an argument, behave exactly like yank-nth-arg. Successive calls to yank-last-arg move back through the history list, inserting the last argument of each line in turn. The history expansion facilities are used to extract the last argument, as if the "!$" history expansion had been specified. 
shell-expand-line (M-C-e)
    Expand the line as the shell does. This performs alias and history expansion as well as all of the shell word expansions. See HISTORY EXPANSION below for a description of history expansion. 
history-expand-line (M-^)
    Perform history expansion on the current line. See HISTORY EXPANSION below for a description of history expansion.
insert-last-argument (M-., M-_)
    A synonym for yank-last-arg. 
operate-and-get-next (C-o)
    Accept the current line for execution and fetch the next line relative to the current line from the history for editing. Any argument is ignored. 
edit-and-execute-command (C-xC-e)
    Invoke an editor on the current command line, and execute the result as shell commands.

Ответ 4

!123:gs/old/new/

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

Ответ 5

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

Введите это:

123М - ^

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

Ответ 6

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

shopt -s histverify

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

Ответ 7

Вместо использования команды 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.

Ответ 8

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

hh

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

Ответ 9

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

Ответ 10

Помещенный

alias r = 'fc -s'

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

r <whatever>

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