Используя расширение истории bash, как мне повторно выполнить последнюю команду с другим последним словом?

Вопрос или проблема

ПРИМЕЧАНИЕ: Я планирую ответить на свой собственный вопрос.

Вот последняя команда, которую я выполнил в командной строке:

git co head -- a/path/to/a/file.ts

Я хочу выполнить это несколько раз, но с разными путями файлов для последнего аргумента/параметра. Эта страница объясняет расширение истории, и я думаю, что ответ, который я ищу, содержится в этом подразделе, но там отсутствуют примеры.

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

git co head -- a/path/to/another/different-file.ts

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

Предположим, что последняя команда была git co head -- a/path/to/a/file.ts, вот как использовать расширение истории, чтобы выполнить git co head -- a/path/to/another/different-file.ts:

    !:0- a/path/to/another/different-file.ts

Документация по дизайнерам слов предоставляет кусочки головоломки, но вам нужно собрать их вместе. Вот разбивка каждого символа расширения истории:

  • !: Ссылается на предыдущую команду

  • :: Следующие символы будут относиться к дизайнерам слов (предыдущей команды).

  • 0: Ссылается на первое слово (git)

  • -: Ссылается на диапазон после первого слова. Если следующим символом было бы другое число, это расширялось бы до этого диапазона слов (из предыдущей команды). Но, если последним символом является -, следующее число по умолчанию будет относиться к предпоследнему слову.

    Например, если в расширенной команде было 5 слов, 0- относится к первым 4.

На самом деле существует более короткий способ записать это. Вы можете опустить 0: !:- эквивалентно вышеуказанному, потому что при отсутствии 3-го параметра он по умолчанию принимает значение 0.

ПРИМЕЧАНИЕ: У меня включена команда bind Space:magic-space, поэтому клавиша пробела развернула !:0- до git co head -- в моем терминале. Я не думаю, что это должно повлиять на ответ, но дайте знать, если я ошибаюсь.

Ответ или решение

Используя расширение истории в Bash, можно легко повторить последнюю команду с другим последним словом. В вашем случае, последней выполненной командой было:

git co head -- a/path/to/a/file.ts

Для того чтобы выполнить эту команду с другим путем к файлу, например a/path/to/another/different-file.ts, можно воспользоваться следующим синтаксисом:

!:0- a/path/to/another/different-file.ts

Вот объяснение компонентов этой команды:

  • !: Этот символ ссылается на последнюю выполненную команду.
  • :: Этот символ указывает, что дальнейшие символы будут рассматривать обозначения слов (word designators) из предыдущей команды.
  • 0: Относится к первому слову предыдущей команды (в данном случае это git).
  • -: Указывает на диапазон после первого слова. Если следующий символ после - будет числом, то это будет расширять диапазон. Однако, если последний символ это -, то по умолчанию он ссылается на предпоследнее слово команды.

Таким образом, !:0- фактически ссылается на все слова, начиная с git и заканчивая предпоследним словом перед последним (то есть на head --). После этого вы можете добавить новое слово, которое заменяет последнее слово предыдущей команды.

На самом деле, ваш запрос можно сократить. Если вы уберете 0, команда будет выглядеть так:

!:- a/path/to/another/different-file.ts

Поскольку третий параметр по умолчанию равен 0, это приведет к тому же результату.

Также упомяну, что если у вас настроено bind Space:magic-space, то нажатие клавиши пробела вами расширяет !:0- до git co head --, что не должно влиять на саму команду.

Таким образом, для выполнения команды с другим файлом просто замените последний аргумент:

git co head -- a/path/to/another/different-file.ts

Надеюсь, это поможет вам!

Оцените материал
Добавить комментарий

Капча загружается...