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


31

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

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

Ответы:


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 заключается в том, что у меня нет мета-ключа.


Я почти никогда не использую восклицательные знаки в командах. Таким образом, метод восклицательного знака отлично работает для меня.
— Вуфферс

Тогда наслаждайся этим. Многие из многочисленных функций вашей оболочки предназначены только для нескольких пользователей.
— Бенуа

На самом деле, вы не должны избегать восклицательных знаков. Есть echo 'Hello, orld!'. Обратите внимание на одинарные кавычки вместо двойных.
— Вуфферс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.