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

31

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

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

Wuffers
источник

Ответы:

38

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

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

Жиль "ТАК - прекрати быть злым"
источник
1
Я попробовал это сам, но это не сработало. Посмотрев на эту должность Michale Мрозек, это говорит использование !:1, !:2. После использования версии с двоеточиями все заработало.
Вуфферс
@MrMan: Ой, верно, если вы пропустите двоеточие с номером, число будет интерпретировано как номер строки. Прости за это.
Жиль "ТАК - перестань быть злым"
Нет проблем. Итак, тогда я предполагаю, что выполнение !1:1будет указывать на первый аргумент первой строки?
Wuffers
4

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

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

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

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

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