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


Ответы:


562

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

Также Alt + .может использоваться для вызова последнего аргумента любой из предыдущих команд.


121
Кроме того , если вы хотите произвольный аргумент, вы можете использовать !!:1, !!:2и т.д. ( !!:0сам предыдущую команду.) См gnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen

41
Аналогично !$, вы используете !^для первого аргумента.
Будет

13
ааа ... * nix ... ты прекрасна ... каждый день я люблю тебя больше
jx12345

Как мы можем ссылаться на второй-последний аргумент предыдущей команды? например, если я дал echo tiger rabbit, как я могу сослаться tigerна следующую команду?
Чан Ким

3
Alt + .не работает в режиме vi. Просто к вашему сведению, для тех, кто был смущен здесь.
Брайан Маккатон

160

Если предыдущая команда имела два аргумента, как это

ls a.txt b.txt

и вы хотели первый, вы могли бы напечатать

!:1

дающий

a.txt

Или, если вы хотели оба, вы могли бы напечатать

!:1-2

дающий

a.txt b.txt

Вы можете расширить это на любое количество аргументов, например:

!:10-12

@RNA, я просто попробовал еще раз, чтобы убедиться, что я не включил опечатку, не могли бы вы предоставить немного больше подробностей (например, командная строка ubuntu, cygwin для windows? Сообщение об ошибке? Предыдущая строка?)
Роберт Гоулэнд,

Я использую GNU bash, версия 3.2.51 (1) -релиз (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Сообщение об ошибке-bash: :1-2: bad word specifier
RNA

2
Я получаю то же самое, если в предыдущей строке не было двух аргументов. Например. Строка 1 ls a.txtСтрока 2ll !:1-2
Роберт Гоулэнд

ты прав. Это глупая ошибка, которую я сделал. Спасибо!
РНК

Также, чтобы получить все аргументы, !:^-$можно использовать или, конечно, аналогичный код в сочетании с числами.
816-8055

88

!!:nгде nпозиция 0 аргумента, который вы хотите.

Например:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

!Префикс используется для доступа предыдущих команд.

Другие полезные команды:

  • !$ - последний аргумент из предыдущей команды
  • !^ - первый аргумент (после программы / встроенного / скрипта) из предыдущей команды
  • !! - предыдущая команда (часто произносится как "bang bang")
  • !n- номер команды nотhistory
  • !pattern - самое последнее совпадение команд pattern
  • !!:s/find/replace- последняя команда, заменить findнаreplace

Больше информации об истории команд


7
Вместо !!:s/find/replace, вы также можете ^find^replace.
Big McLargeHuge

Также: !* - все аргументы из предыдущей команды (после программы / встроенного / скрипта). Например: ls *.tmp *.cache rm !*
Афоид

68

В командной строке вы можете нажать esc- .или alt+.

Он перебирает последний аргумент ваших предыдущих команд.


Я всегда находил и ключи к работе , а также.
Ведро

Ключи @Bucket идут через предыдущие команды, в то время как решение, предоставленное Антонио, позволяет проходить через предыдущие аргументы (только последний аргумент каждой предыдущей команды)
everyonesdesign

30

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

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

!3:2

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

!-5:3

Используя знак минус, вы просите его перейти от последней команды в истории.


19

! * запускает новую команду со всеми предыдущими аргументами.

ls /tmp
cd !*
#you are now in /tmp

Это не работает для меня на OSX - пришлось использовать $_вместо этого.
Майк W

16

Да, вы можете использовать !$для вызова последнего аргумента предыдущей команды.


Помните о ключевом слове «последний», особенно если ваша команда содержит несколько аргументов.
Ведро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.