Как использовать аргументы из предыдущей команды?
Я знаю, что 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
.