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

5663
Wuffers

В bash вы можете использовать !*все аргументы предыдущей команды. Например, если вы сделали, cp /some/path /some/other/pathа затем сделали mv !*, вторая команда будет расширена до mv /some/path /some/other/path.

Есть ли что-то подобное, что можно использовать для доступа к определенному аргументу команды вместо всех?

30

2 ответа на вопрос

36
Gilles

В !*, !является расширение истории префикс, и *это слово обозначение, что означает, что все аргументы. Вы можете запомнить общий синтаксис как bang-line-colon-column ( столбец !строки :). Существует множество возможных сочетаний клавиш: строка по умолчанию - это предыдущая строка, спецификатор столбца по умолчанию - «all», и вы можете опустить двоеточие, если спецификатор столбца не числовой (но !3будет означать строку 3). Вы можете использовать !:0для ссылки на имя команды !:1, !:2и т. Д., Чтобы ссылаться на последовательные аргументы, !:$на последнее слово, !:*на все аргументы и многое другое.

Смотрите также этот пост Майкла Мрозека на Unix Stack Exchange .

Я попробовал это сам, но это не сработало. Посмотрев на пост Михаэля Мрозека, он говорит использовать `!: 1`,`!: 2`. После использования версии с двоеточиями все заработало. Wuffers 13 лет назад 1
@MrMan: Ой, верно, если вы пропустите двоеточие с номером, число будет интерпретировано как номер строки. Извини за это. Gilles 13 лет назад 0
Нет проблем. Итак, я предполагаю, что выполнение `! 1: 1` будет указывать на первый аргумент первой строки? Wuffers 13 лет назад 0
4
Benoit

Лично мне очень не нравится эта функция «расширения с восклицательным знаком», которая будет даже мешать, если вы попробуете использовать echo "Hello World!"интерактивные оболочки (поэтому сценарии поиска, предполагающие, что они будут работать в неинтерактивном режиме, вообще не будут работать).

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

Esc, 1, Esc, Ctrl-Y => Insert first argument of previous command. 

Обратите внимание, что трюк с Esc заключается в том, что у меня нет мета-ключа.

Я почти никогда не использую восклицательные знаки в командах. Таким образом, метод восклицательного знака отлично работает для меня. Wuffers 13 лет назад 0
Тогда наслаждайся этим. Многие из многочисленных функций вашей оболочки предназначены только для нескольких пользователей. Benoit 13 лет назад 0
На самом деле, вы не должны избегать восклицательных знаков. Do `echo 'Здравствуйте, orld!'`. Обратите внимание на одинарные кавычки вместо двойных. Wuffers 13 лет назад 0

Похожие вопросы