Вопрос или проблема
Я использовал
history | less
, чтобы получить строки предыдущих команд, и по номерам с левой стороны я нашел нужную строку (например, 22) и ввел
!22
в командной строке, и это сработало — выполнив набор команд, который я выполнил в то время. Я не могу понять, где используется восклицательный знак, что он представляет в терминах действий, выполняемых bash, и где его использовать. В документации я не вижу объяснений, которые были бы ‘осязаемыми’.
!
вызывает расширение истории, функцию, которая изначально появилась в C shell, в те времена, когда на терминалах нельзя было рассчитывать на наличие стрелочных клавиш. Это особенно полезно, если вы добавите номер текущей команды в подсказку (PS1="\!$ "
), чтобы вы могли быстро взглянуть на экран и получить номера для предыдущих команд.
Теперь, когда вы можете использовать стрелочные клавиши и такие вещи, как Ctrl-R для поиска в истории команд, я не вижу большого смысла в этой функции.
Один из вариантов, который вы все еще можете найти полезным, это !!
, который повторно выполняет предыдущую команду. Сам по себе, я не нахожу !!Enter быстрее, чем просто ↑ Enter, но это может быть полезно в сочетании с более крупной командой.
Пример: Обычная ошибка пилота на системах, основанных на sudo
, заключается в том, что забывают префикс sudo
для команды, требующей дополнительных привилегий. Новичок перепечатывает всю команду. Усердный студент редактирует команду из истории команд оболочки. Просветленный же вводит sudo !!
.
Обработка !
таким образом включена в Bash по умолчанию в интерактивных оболочках и может быть отключена с помощью set +o histexpand
или set +H
. Вы можете отключить это в Zsh с помощью set -K
.
Если здесь нет более длинного ответа, то определенно есть на Super User, так как я недавно читал один. В мануале bash вы можете найти огромный раздел под названием РАСШИРЕНИЕ ИСТОРИИ по этому вопросу.
Вы можете сделать гораздо больше, чем просто выполнить последнюю команду или команду номер X. Вы можете делать такие вещи, как !cat
, чтобы выполнить последнюю команду, начинающуюся с cat
. Или !?bash?:s/bash/csh/
выполняет последнюю команду, содержащую bash
, но заменяет ее на csh
.
Можно сделать гораздо больше с !
, например:
- выполнить команду, которую вы ввели перед 3 командами:
!-3
- выполнить команду, начинающуюся с
!ls
и многое другое. См. 15 примеров расширения истории Bash в Linux, которые вы должны знать
Конечно, вы можете использовать !!
, чтобы повторно использовать последнюю команду в оболочке bash. А затем есть !$
, чтобы повторно использовать последнюю часть вашей последней команды.
например, просмотр какого-то файла
less path/to/your/file.txt
Если вы хотите отредактировать тот же файл, вы можете использовать !$
, чтобы получить только путь к файлу из последней команды
vim !$
ИЗМЕНЕНИЕ:
Вы можете использовать все аргументы предыдущей команды с !*
например: Это создаст несколько файлов и удалит все из них
$ touch a.txt b.txt c.txt d.txt
$ rm !*
Снова вы можете использовать конкретный аргумент предыдущей команды
например. Это создает 4 файла и удалит 3-й файл (c.txt)
$ touch a.txt b.txt c.txt d.txt
$ rm !:3
Аналогично, вы можете использовать диапазон аргументов из последней команды следующим образом
$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4
Это повторно использует аргументы 2 до 4, что приводит к выражению rm b.txt c.txt d.txt
.
Мне написал друг:
Это часть библиотеки истории GNU. В bash это используется для повторного выполнения команд из вашей истории. Если вы хотите быть крутым, используйте grep для history_expansion_char в bash-4.1/lib/readline/histexpand.c для деталей реализации.
Ответ или решение
Понимание восклицательного знака (!) в Bash
Bash, как один из наиболее популярных интерпретаторов командной строки в системах Unix и Linux, предоставляет мощные инструменты для организации и манипуляции командной историей. Одним из таких инструментов является восклицательный знак (!), который активирует механизм расширения истории.
Что такое расширение истории в Bash?
Расширение истории в Bash позволяет пользователю выполнять ранее введенные команды более эффективно, не вводя их повторно. Эта функция была заимствована из C shell, когда терминалы не имели функционала, которым мы сегодня наслаждаемся, например, клавишами стрелок для навигации по истории команд.
Основные команды с использованием восклицательного знака
-
Выполнение определенной команды по номеру:
- Использование
!N
(где N — номер строки из истории команд) позволяет быстро повторить команду. Например, если команда номер 22 в вашей истории былаls -l
, просто введя!22
, вы выполните эту команду снова.
- Использование
-
Повторение последней команды:
- Двойной восклицательный знак
!!
используется для повторного выполнения последней введенной команды, что может значительно ускорить рабочий процесс.
- Двойной восклицательный знак
-
Использование последних аргументов:
- Механизм
!$
позволяет повторно использовать последний аргумент предыдущей команды. Например, после командыless файл.txt
, вы можете ввестиvim !$
для редактирования того же файла.
- Механизм
-
Выполнение команды, начинающейся на определенную строку:
- Например,
!cat
выполнит последнюю команду, которая начиналась сcat
.
- Например,
-
Использование различных частей предыдущей команды:
- Расширение
!:n
позволяет получить n-й аргумент предыдущей команды, а!:n-m
— использовать диапазон аргументов. Например:touch a.txt b.txt c.txt d.txt
rm !:3
(удалитc.txt
)rm !:2-4
(удалитb.txt
,c.txt
,d.txt
)
- Расширение
-
Выполнение команды на основе других критериев:
- Команда
!?string?
найдет и выполнит последнюю команду, содержащую определенную строку. Например,!?bash?
выполнит последнюю команду, в которой упоминаетсяbash
.
- Команда
Включение и отключение расширения истории
По умолчанию расширение истории включено в интерактивных оболочках Bash. Его можно отключить с помощью команд:
set +o histexpand
set +H
В Zsh аналогичная команда — set -K
.
Заключение
Восклицательный знак в Bash — это могущественный инструмент, который позволяет упростить и ускорить работу с командной историей. Понимание его возможностей может значительно повысить вашу продуктивность при работе в командной строке. Этот инструмент особенно полезен для опытных пользователей, которые часто повторяют команды или работают с большими объемами запросов.
Для более подробного изучения механизма расширения истории в Bash вы можете ознакомится с разделом "HISTORY EXPANSION" в документации Bash.
Использование таких возможностей, как !!
, !$
, и !:n
, позволяет разработчикам и системным администраторам работать более эффективно, избегая повторного ввода однотипных команд.