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

312

В Bash есть способ вспомнить аргумент предыдущей команды?

Я обычно vi file.cследую gcc file.c.

В Bash есть способ вспомнить аргумент предыдущей команды?

Кодер
источник
2
Возможный дубликат: stackoverflow.com/questions/4009412/…
eugenevd

Ответы:

562

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

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

codaddict
источник
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

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

Johntron
источник
7
Вместо !!:s/find/replace, вы также можете ^find^replace.
Big McLargeHuge
Также: !* - все аргументы из предыдущей команды (после программы / встроенного / скрипта). Например: ls *.tmp *.cache rm !*
Афоид
68

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

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

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

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

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

!3:2

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

!-5:3

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

Madisz
источник
19

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

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

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

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

Джастин этир
источник
Помните о ключевом слове «последний», особенно если ваша команда содержит несколько аргументов.
Ведро