30

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

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

2 ответа2

36

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

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

4

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .