Я знаю, что Esc + . дает последний аргумент последней команды.
Но меня интересует первый аргумент последней команды. Есть ли привязка клавиш для этого?
В тех же строках существует общий способ получения n-го аргумента из последней команды?
Я знаю, что в bash script вы можете использовать $0
, $1
и т.д., Но они не работают в командной строке.
Кроме того, что касается итерации через 0-й аргумент предыдущих команд, как мы можем сделать с последним аргументом, непрерывно нажимая Esc + .?
Точно так же, как 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 или отрицательных аргументов.
!$
получает последний элемент предыдущего аргумента командной строки.
!^
получает первый ...
!: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-
несколько противоречит интуиции, так как она не включает последний аргумент.
Мне понравилось, что @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.
! ^ может быть командой для первого аргумента. Я не уверен, есть ли способ получить nth.
!:n
, но считая с конца, а не с начала?
Вы также можете получить аргументы из любой команды в своей истории!
$ 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
В основном это используется в 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 после имени своего изобретателя), что является оболочкой по умолчанию во многих дистрибутивы, включая серверы (серверные ОС).
Метод, описанный в конце принятого ответа, также работает с нулевым аргументом для меня. У меня эти строки в моем ~/.inputrc
:
"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."
\e2\e.
имеет преимущество перед \e2\e\C-y
, что он циклически перебирает предыдущие команды, если он нажимается повторно, вместо того, чтобы вставлять второй аргумент предыдущей команды несколько раз.
Чтобы вставить всю предыдущую команду, вы можете ввести !!\e^
. \e^
history-expand-line
.
bind -lp
и смотреть текущие привязки.-s
(новое в Bash 4) перечисляет макросы, созданные с помощью-x
.