Как использовать аргументы из предыдущей команды? - PullRequest
255 голосов
/ 24 октября 2010

Я знаю, что Esc + . дает вам последний аргумент последней команды.

Но меня интересует первый аргумент последней команды.Есть ли для этого привязка клавиш?

В тех же строках существует ли общий способ получения n-го аргумента из последней команды?Я знаю, что в скрипте bash вы можете использовать $0, $1 и т. Д., Но они не работают в командной строке.

Кроме того, как насчет перебора 0-го аргументапредыдущие команды, как мы можем сделать с последним аргументом, непрерывно нажимая Esc + . ?

Ответы [ 10 ]

280 голосов
/ 06 января 2013

!$ получает последний элемент предыдущего аргумента командной строки.

264 голосов
/ 25 октября 2010

Так же, как M-. (мета-точка или esc-точка или alt-точка) является функцией readline yank-last-arg, M-C-y (meta-control-y или esc-ctrl-y или ctrl-alt-y) является функцией readline yank-nth-arg.Без указания n он возвращает первый аргумент предыдущей команды.

Чтобы указать аргумент, нажмите клавишу Escape и число или удерживайте Alt и нажмите число.Вы можете сделать Alt - - , чтобы начать указывать отрицательное число, затем отпустите Alt и нажмите цифру (это будет считаться с конца списка аргументов.

Пример:

Введите следующую команду

$ echo a b c d e f g
a b c d e f g

Теперь в следующем приглашении введите echo (со следующим пробелом), затем

Нажмите Alt - Ctrl - y , и вы увидите:

$ echo a

без нажатия Введите , сделайте следующее

Нажмите Alt - 3 Alt - Ctrl - y

Нажмите Alt - - 2 Alt - Ctrl - y

Теперь вы увидите:

$ echo ace

Кстати, вы могли бы поставить echo на строку, выбрав аргумент 0:

Нажмите Alt - 0 Alt - Ctrl - y

Редактировать:

Чтобы ответить на вопрос, который вы добавили в свой оригинал:

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

Если в конкретной строке в истории нет подходящего аргумента, прозвучит звонок.

Если есть частая комбинация, которую вы часто используете, вы можете определить макрос так, чтобы он выполнялся одним нажатием клавиши.,Этот пример вызовет второй аргумент из предыдущих команд, нажав Alt - Shift - Y .Вы можете выбрать любое доступное нажатие клавиши вместо этого.Вы можете нажимать его несколько раз, чтобы перейти к предыдущим.

Чтобы опробовать его, введите макрос в приглашении Bash:

bind '"\eY": "\e2\e."'

Чтобы сделать его постоянным, добавьте эту строку в свой ~/.inputrc file:

"\eY": "\e2\e."

К сожалению, это не работает для аргументов 0 или отрицательных аргументов.

177 голосов
/ 01 сентября 2015

Чтобы использовать первый аргумент, вы можете использовать !^ или !:1

Пример:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

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

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

Первые четыре формы используются чаще. Форма !:2- несколько нелогична, так как не содержит последнего аргумента.

50 голосов
/ 10 июля 2014

Мне так понравился ответ @larsmans, что мне пришлось больше узнать. Добавление этого Ответьте, чтобы помочь другим найти раздел справочной страницы и узнать, что Google для:

$ man  -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators

Word designators are used to select desired words from the event.
A : separates the event specification from the word designator.
It may be omitted if the word designator begins with a ^, $, *, -,
or %.  Words are numbered from the beginning of the line, with the
first word being denoted by 0 (zero).  Words are inserted into the
current line separated by single spaces.

   0 (zero)
          The zeroth word.  For the shell, this is the command word.
   n      The nth word.
   ^      The first argument.  That is, word 1.
   $      The last argument.
   %      The word matched by the most recent ‘?string?’ search.
   x-y    A range of words; ‘-y’ abbreviates ‘0-y’.
   *      All of the words but the zeroth.
          This is a synonym for ‘1-$’.  
          It is not an error to use * if there is just one word in
          the event; the empty string is returned in that case.
   x*     Abbreviates x-$.
   x-     Abbreviates x-$ like x*, but omits the last word.

   If a word designator is supplied without an event
   specification, the previous command is used as the event.
19 голосов
/ 24 октября 2010

! ^ Может быть командой для первого аргумента.я не уверен, есть ли способ получить nth.

12 голосов
/ 14 апреля 2016

Вы также можете получить аргументы от любой команды в вашей истории!

<code>
$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
  601  echo build/libs/jenkins-utils-all-0.1.jar
  602  history | tail -10
  603  echo a b c d e f g
  604  echo build/libs/jenkins-utils-all-0.1.jar
  605  history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
3 голосов
/ 01 мая 2017

В основном он используется для восстановления предыдущий (команды) аргументы .

Например, если введена следующая команда:

echo Hello, world how are you today?

тогда Hello, будет первым аргументом, а today? шестым , то есть последним;то есть на него можно ссылаться, набрав:

Alt + 6 , а затем Ctrl-Alt-6


Ctrl традиционно обозначается как шляпный символ ^ перед именами клавиш, а Alt как M-, то есть M eta prefix.

Таким образом, вышеупомянутый ярлык может быть переопределен как ^My в yank.


Кроме того, в командной строке есть hats заменяющий ярлык:

echo Hello, world!

^Hello^Bye

Bye, world!

для замены первой совпавшей строки предыдущей команды , что означает:

Hello, world! Hello, people!

^Hello^Bye

приведет к:

Bye, world! Hello, people!

оставив второе совпадение (hello) без изменений.

Примечание. Не оставляйте пробел между шляпами , иначе операция не будет работать.


Выше указанопросто ярлык для:

!:s/Hello/Bye

подстановка уровня события (*) для первой найденной (совпавшей) строки в предыдущей команде, в то время как префикс первой части с переключателем g будет применяться к вся строка g lobally :

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

, как это обычно делается в других связанных командах, таких как sed, vi и в regex (регулярное выражение) - стандартный способ поиска ( строка соответствия ).

Нет, вы не можете сделать !:sg/Hello/Bye или !:s/Hello/Bye/g здесь, это синтаксис !


  • !для событий;событие может быть понято как вывод команды или операция, выполненная в истории команд.

Это то, что я понял, используя его сам и пробуя самостоятельно, исходя из того, что я читал из различных источников, включая руководствостраницы, блоги и форумы.

Надеюсь, что это проливает некоторый свет на загадочные способы bash, оболочки Bourne-Again (игра на оболочке sh, которая сама по себе называется оболочкой Bourne после ее изобретателяфамилия), какова оболочка по умолчанию во многих дистрибутивах, включая серверы ( серверные ОС ).

1 голос
/ 08 марта 2019

Протестировано в Ubuntu 18.04


Чтобы вставить предыдущие аргументы:

  • Alt + . : вставить последний аргумент изпоследняя команда (повторите, чтобы вернуться в историю)
  • Alt + # + . : вставить # последнийаргумент из последней команды (повторите, чтобы вернуться в историю)
  • Alt + - , # , Alt + . , zsh: Alt + - + # + .: вставить #nth первый аргумент из последней команды (повторите, чтобы вернуться в историю)

Пример:

Последняя команда:

mv foo bar
  • Alt + 0 + . : вставить первый аргумент последней команды = mv
  • Alt + 2 + . : вставить последний 2-й аргумент последней команды = foo
  • up , Ctrl + w : последняя команда без последнего слова = mv foo

Общие ярлыки

  • Ctrl + w : удаляет последнее слово из курсора
  • Alt + d : удаляет следующее слово из курсора
  • Ctrl + k : вырезает все после курсора
  • Ctrl + u , zsh: Alt + w : вырезает все перед курсором
  • zsh: Ctrl + u : вырезать всю команду (В bash вы можете комбинировать Ctrl + u , Ctrl + k )
  • Ctrl + y : вставить символы, ранее вырезанные с помощью Ctrl + u и Ctrl + k
  • Ctrl + _ :отменить последнее редактирование (очень полезно при превышении Ctrl + w )
  • Ctrl + слева : перейти к последнему слову
  • Ctrl + вправо : перейти к следующему слову
  • home или Ctrl + a : перейти к началу строки
  • end или Ctrl + e : перейти к концу строки

Чтобы перебрать аргументы предыдущей команды

работает только в zsh

run или добавьте это к~/.zshrc

autoload -Uz copy-earlier-word
zle -N copy-earlier-word
bindkey "^[:" copy-earlier-word

Теперь используйте Alt + . , чтобы вернуться так, как вы хотите, затем используйте Alt + : для итерации аргументов

Предполагается, что последняя команда

echo 1 2 3 4 5
  • Alt + . : 5
  • Alt + . + : : 4
  • Alt + . + : + : : 3
  • Alt + . + : + : + : : 2
  • Alt + . + : + : + : + : : 1
  • Alt + . + + + + + : : echo

источник: https://stackoverflow.com/a/34861762/3163120

Чтобы увидеть все доступные ярлыки

  • bash: bind -lp
  • zsh: bindkey -L
1 голос
/ 06 ноября 2018

! ^ Даст вам первый параметр,! $ - последний параметр,!: n - n-й элемент.

0 голосов
/ 06 декабря 2015

Метод, описанный в конце принятого ответа, также работает для меня с нулевым аргументом. У меня есть эти строки в моем ~/.inputrc:

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e. имеет преимущество перед \e2\e\C-y в том, что циклически повторяет предыдущие команды, если его нажимать несколько раз, вместо многократного ввода второго аргумента предыдущей команды.

Чтобы вставить всю предыдущую команду, вы можете набрать !!\e^. \e^ - это history-expand-line.

...