Расширение истории в bash

Shell поддерживает функцию расширения истории, которая похожа на расширение истории в csh. В этом разделе описываются доступные функции синтаксиса. Эта функция включена по умолчанию для интерактивных оболочек и может быть отключена при помощи опции +H встроенной команды set (Встроенные команды я буду описывать в дальнейшем). Неинтерактивные оболочки не выполняют расширение истории по умолчанию.

Расширение истории выводит слова из списка истории в входной поток, что позволяет с лёгкостью повторять команды, вставку аргументов предыдущей команды в текущую строку ввода, или быстро исправлять ошибки в предыдущих командах.

Расширение истории выполняется сразу же после полного чтения строки, до того как shell разбивает его на слова. Это происходит в двух частях. Первая определяет какую строку из списка истории использовать при замене. Вторая заключается в выборе части этой строки для включения в текущую строку. Выбранная строка из истории является событием, и частью из этой строки, которая действовала на слова. Различные модификаторы доступны для манипулирования выбранными словами. Строка разбивается на слова тем же образом, что при чтении ввода, так что несколько слов метасимволов, заключённых в кавычки, являются одним словом. Расширение истории вводится появлением расширения истории символа, который является по умолчанию «!». Только обратная косая черта «\» и одинарные кавычки могут указывать символ расширения истории.

Несколько символов препятствуют расширению истории, если находятся сразу же после символа расширения истории, даже если он без кавычек: пробел, табуляция, символ новой строки, возврат каретки и «=». Если включена shell опция extglob, «(» так же будет препятствовать расширению.

Несколько shell опций устанавливаемые со встроенной командой shopt могут быть использованы для адаптации поведения расширения истории. Если включена shell опция histverify (описание Встроеной команды shopt я буду писать в дальнейшем) и используется readline, история замены не сразу переходит к анализатору командного интерпретатора. Вместо этого расширение строки перезагружается в readline буфера редактирования для дальнейшей модификации. Если используется библиотека readline, и включена shell опция histreedit, удачная замена истории будет перезагружена в буфер редактирования readline для коррекции. Опция -p встроенной команды history может быть использована чтобы увидеть что расширение истории сделает до его использования. Опция -s встроенной команды history может быть использована для добавления команд к концу списка истории без её фактического выполнения, так что они доступны для последующего вызова.

Shell позволяет управлять различными символами используемыми механизмом расширения истории (см. описание histchars ранее в разделе Переменных командного интерпретатора). Shell использует символ комментария истории, чтобы отметить временные метки при записи файла истории.

Отметки событий

 

Отметкой событий является ссылка на запись командной строки в списке истории. Если ссылка не является абсолютной, событие сравнивается с текущей позицией в списке истории.

! Начинает подстановку истории, за исключением, когда далее следует пустая строка, новая строка, возврат каретки, = или (

(при включенной shell опции extglob, включается с помощью встроенной команды shopt)

 

!n Сослаться на командную строку n.

!-n Сослаться к текущей команде минус n.

!! Сослаться к предыдущей команде. Это синоним для ‘!-1‘.

!string

Ссылается на самую последнюю команду, предшествующую текущей позиции в списке истории, начинающуюся со string.

!?string[?]

Ссылается на самую последнюю команду, предшествующую текущей позиции в списке журнала содержащего string. Завершающий символ «?» может быть опущен, если за string сразу следует новая строка.

^string1^string2^

Быстрая замена. Повторяет предыдущую команду, заменяя string1 на string2. Эквивалентно »!!:s/string1/string2/»(Модификаторы я буду описывать в дальнейшем).

!# Набирается вся набранная командная строка до данного момента.

Обозначения слова

Обозначения слова используются для выбора желаемых слов из события. Двоеточие «:» отделяет спецификацию событий от обозначения слова. Двоеточие может быть опущено, если слово начинается с ^, $, *, , или %. Слова нумеруются из начала строки, с первого слова обозначенного нулем (0). Слова вставляются в текущую строку разделённые одним пробелом.

 

0 (zero)

Нулевое слово. Для shell является командным словом.

n n-ое слово.

^ Первый аргумент. То есть, слово 1.

$ Последний аргумент.

% Слово сопоставляющееся при последнем поиске ‘?string?

x-y Диапазон слов; ‘-y‘ абревиатура ‘0-y‘.

* Все слова кроме нулевого. Это синоним для ‘1-$‘. Не является ошибкой использовать * если есть только одно слово, возвращается пустая строка.

x* Абревиатура x-$.

x- Абревиатура x-$ аналогична x*, но опускает последнее слово.

 

Если обозначение слова поставляется без спецификации события, предыдущая команда используется в качестве события.

 

Модификаторы

 

После необязательного обозначения слова, может появится последовательность одной или нескольких из следующих модификаторов, каждому из которых предшествует ‘:‘.

h Удалить завершающий компонент имени файла, оставив только начало.

t Удалить все начальные компоненты имени файла, оставляя только конец.

r Удалить завершающий суффикс вида .xxx. Оставляя базовое имя.

e Удалить все кроме завершающего суффикса.

p Распечатать новую команду, но не выполнять её.

q Заключает в кавычки подставляемые слова, для предотвращения дальнейших подстановок.

x Заключает в кавычки подставляемые слова, так же как модификатор q, но разбивает слова на пробелы и переводы строк.

s/old/new/

Подставляет new вместо первого вхождения old в строке события. Вместо / можно использовать любой разделитель. Завершающий разделитель необязателен, если он является последним символом в строке события. Разделитель в строках old и new может быть замаскирован обратной косой чертой. Если метасимвол & появляется в строке new он заменяется на old. Одна обратная косая черта маскирует &. Если строка old является пустой, вместо нее используется строка из последней подстановки по времени или если никаких предыдущих подстановок небыло, последней строки найденной с помощью конструкции !?string[?].

& Повторяет предыдущую подстановку.

g Вызывает изменения которые должны приниматься по всей строке события. Это используется в сочитании с ‘:s‘ (например ‘:gs/old/new/‘) или ‘:&‘. Если используется с ‘:s‘ любой разделитель может быть использован вместо /, и завершающий разделитель не является обязательным, если он является последним символом в строке события. Может быть использован в качестве синонима для g.

G Применить модификатор ‘s‘ один раз, только к каждому слову в строке состояния.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *