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

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

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

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

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

Ответ 1

Точно так же, как 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 или отрицательных аргументов.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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


$ 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

Ответ 7

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

Ответ 8

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

Ответ 9

Проверено на Ubuntu 18.04


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

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

Пример:

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

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 + left: перейти к последнему слову
  • Ctrl + right: перейти к следующему слову
  • home или Ctrl + a: перейти к началу строки
  • end или Ctrl + e: перейти к концу строки

Для перебора аргументов в предыдущей команде

работает только в зш

запустите или добавьте это в ваш ~/.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

источник: fooobar.com/questions/11237054/...

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

  • bash: bind -lp
  • zsh: bindkey -L

Ответ 10

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

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

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

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