Быстро заменить первое слово в bash-команде

Быстрые ссылки
Вопрос
Ответ
Если в рабочем процессе много однообразных действий, полезно упростить последовательности команд. Ниже — перевод и адаптация обсуждения из SuperUser (часть Stack Exchange) о том, как быстро заменить первое слово в команде bash.
Вопрос
Читатель SuperUser coin спросил, как быстро заменить первое слово в команде bash. Он знал способ: нажать Ctrl+a (переместиться в начало строки), затем Del, но хотел найти более быстрый приём, особенно когда нужно повторно выполнить ту же последовательность аргументов с другим исполняемым файлом (например, заменить git на bash или наоборот).
Ответ
Ниже — выжимка ответов, упрощённая и структурированная.
История расширения (history expansion)
!*— разворачивается в все слова предыдущей команды, кроме нулевого (т.е. без самого имени команды). Это идеально подходит, если нужно взять все аргументы предыдущей команды и подставить их после нового имени команды.Пример:
git commit -m "Initial commit" hg !* # Разворачивается в: hg commit -m "Initial commit"!$— разворачивает только последнее слово предыдущей команды. Подходит, когда нужно повторить только последний аргумент.Пример:
echo /some/long/path ls !$ # Разворачивается в: ls /some/long/path
Важно: см. раздел “Когда это может не сработать” ниже.
Быстрое редактирование строки с помощью readline
Ctrl+a— перейти в начало строки.Alt+d(илиMeta+d) — удалить следующее слово (в терминалах Linux Meta обычно сопоставлен с Alt). Если на вашей платформе Alt не работает как Meta, можно нажатьEscпередd.
Последовательность:
- Нажмите
Ctrl+a. - Нажмите
Alt+d.
Это удалит первое слово в текущей строке, оставив аргументы, которые можно дополнить другим именем команды.
Предупреждение по безопасности и надёжности
Важно: история расширения может подставлять неожиданные фрагменты, если предыдущие команды содержали спецсимволы, кавычки или если вы ввели команду с пробелом в начале (в зависимости от настроек истории). Поэтому перед выполнением команд с расширением истории полезно проверить, что именно будет подставлено:
echo !*
# или
printf '%q ' !*Если результат ожидаем — нажмите Enter с вашей новой командой.
Когда это может не сработать (контрпримеры)
- Если аргументы содержат пробелы и кавычки, история может интерпретировать их иначе.
- Если предыдущая команда была выполнена в другом контексте (например, с ведущим пробелом и с опцией shell, исключающей сохранение в историю), расширение может ссылаться на другое место в истории.
- Расширение истории не проходит через повторную проверку синтаксиса в некоторых случаях: лучше предварительно вывести результат
echo !*.
Альтернативные подходы
- Использовать readline-редактирование (Ctrl+a, Alt+d или Esc+d) — безопасно и не зависит от истории.
- Создать небольшую функцию-обёртку в
~/.bashrc, если вы часто повторяете определённую трансформацию:
# пример: заменить git на hg и выполнить с теми же аргументами
gg() {
hg "$@"
}- Использовать
fcили экспортировать/редактировать команду из истории для сложных исправлений.
Шпаргалка: сочетания клавиш и расширения
| Действие | Команда/сочетание |
|---|---|
| Повторить все аргументы предыдущей команды (без имени) | !* |
| Повторить только последнее слово предыдущей команды | !$ |
| Перейти в начало строки | Ctrl+a |
| Удалить следующее слово | Alt+d или Esc затем d |
| Предпросмотр подстановки истории | echo !* |
Ролевые чек-листы
Разработчик:
- Используйте
!*, чтобы быстро переключать исполняемые файлы для тех же аргументов. - Всегда проверяйте подстановку через
echoпри работе с кавычками.
- Используйте
Системный администратор:
- Предпочитайте клавиатурные приёмы (Ctrl+a, Alt+d) при работе с привилегированными командами.
- Не полагайтесь на историю для команд, содержащих пароли или секреты.
Новичок в bash:
- Попрактикуйтесь с
echo !*— это безопасный способ увидеть подстановку. - Запомните:
Altна Linux часто выполняет роль Meta; если не работает, пробуйтеEsc.
- Попрактикуйтесь с
Мини-методология: как быстро и безопасно заменить первое слово
- Оцените: требуется ли повторить все аргументы предыдущей команды или только последнее слово.
- Для всех аргументов используйте
newcmd !*. - Для одного аргумента используйте
newcmd !$. - При сомнении предварительно выполните
echo !*. - Если не хотите рисковать с историей — выполните
Ctrl+a,Alt+d, введите новое имя команды.
Краткое содержание
!*— лучший способ подставить все аргументы предыдущей команды, кроме команды.Alt+d(илиEsc+d) удалит первое слово в строке.- Всегда полезно предварительно выводить подстановку через
echoи быть осторожным с кавычками и спецсимволами в истории.
Если хотите — добавьте свои примеры и замечания в комментариях к обсуждению на SuperUser. Хотите посмотреть полный тред — найдёте его на странице SuperUser.
Похожие материалы
Исправить ошибку «Oops! Something went wrong» в YouTube
Экран входа macOS — настройки и советы
Удалить историю Google Bard и отключить её
TinyLetter для блогеров: быстро и просто
Как включить и отключить блокировщик всплывающих окон IE11