Как использовать аргументы из предыдущей команды?

219

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

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

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

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

Теги:
keyboard-shortcuts
command-line

8 ответов

241
Лучший ответ

Точно так же, как M-. (meta-dot или esc-dot или alt-dot) является функцией 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

не нажимая Enter, сделайте следующее

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

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

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

$ echo ace

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

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

Edit:

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

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

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

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

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

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

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

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

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

  • 12
    При поиске сочетаний клавиш для bash / readline мне нравится запускать bind -lp и смотреть текущие привязки.
  • 1
    @ChadSkeeters: And -s (новое в Bash 4) перечисляет макросы, созданные с помощью -x .
Показать ещё 2 комментария
246

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

  • 86
    !^ получает первый ...
  • 93
    !:3 - третий
Показать ещё 6 комментариев
144

Чтобы использовать первый аргумент, вы можете использовать !^ или !: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- несколько противоречит интуиции, так как она не включает последний аргумент.

  • 3
    где документы для этого?
  • 0
    Я читал это из различных книг О'Рейли по Bash или Linux
Показать ещё 3 комментария
46

Мне понравилось, что @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.
20

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

  • 5
    это!: n как предложено выше
  • 0
    Есть ли способ получить n-й последний элемент, такой как !:n , но считая с конца, а не с начала?
11

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


$ 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
2

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

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

echo Hello, world how are you today?

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

Alt+6, за которым следует Ctrl-Alt-6


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

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


Кроме того, в командной строке есть ярлык замены шляп:

echo Hello, world!

^Hello^Bye

Bye, world!

чтобы заменить предыдущую команду первой согласованной строкой, что означает:

Hello, world! Hello, people!

^Hello^Bye

приведет к:

Bye, world! Hello, people!

оставляя второе совпадение (hello) неизменным.

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


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

!:s/Hello/Bye

подстановка на уровне события (*) для первой найденной (сопоставленной) строки в предыдущей команде, в то время как префикс первой части с помощью переключателя 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 после имени своего изобретателя), что является оболочкой по умолчанию во многих дистрибутивы, включая серверы (серверные ОС).

0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню