Подстановка хронологии позволяет получить новые команды путем замены слов в предыдущих командах. С помощью подстановки хронологии можно повторить команду, перенести аргументы предыдущей команды в текущую команду или исправить орфографические ошибки в предыдущей команде.
Подстановки хронологии начинаются с символа ! и могут располагаться в любом месте командной строки. Однако подстановки не могут быть вложенными (другими словами, подстановка хронологии не может содержать подстановку хронологии). Для того чтобы блокировать специальное значение символа ! , укажите перед ним символ \ . Кроме того, если символ ! указан перед символом пробела, табуляции, новой строки, = или ( , то подстановка хронологии не выполняется.
Подстановка хронологии выполняется и для тех строк, которые начинаются с символа ^ . Перед обработкой строки, содержащей подстановки хронологии, оболочка выводит ее на экран рабочей станции.
В этом разделе приведена информация по следующим темам:
В список хронологии заносятся команды длиной в одно или несколько слов, считанные оболочкой из командной строки. Подстановка хронологии заключается в том, что из строк сохраненных команд выбираются последовательности слов, которые записываются в стандартный ввод.
Размер списка хронологии задается в переменной оболочки history. Значение переменной history можно указать в файле .cshrc или в параметре встроенной команды set. Независимо от значения переменной history, последняя выполненная команда всегда сохраняется. В списке хронологии команды последовательно нумеруются, начиная с 1. Если вы введете встроенную команду history, то появится приблизительно следующий вывод:
9 write michael 10 ed write.c 11 cat oldwrite.c 12 diff *write.c
Будут показаны команды и номера соответствующих событий (порядковые номера). Для ссылки на событие не обязательно применять номер события, однако номер текущего события может отображаться в приглашении системы. Для этого укажите символ ! в строке приглашения, связанной с переменной среды prompt.
Полная ссылка на хронологию содержит указание события, ссылку на слово и один или несколько модификаторов в следующем формате:
Событие[.]Слово:Модификатор[:Модификатор] . . .
Примечание: Можно изменить не более одного слова. Строка не может содержать пробелы.
В предыдущем примере вывода
команды history номер текущего события равен 13. В этом
примере можно задать следующие ссылки на предыдущие события:
!10 | Событие номер 10. |
!-2 | Событие номер 11 (номер текущего события минус 2). |
!d | Команда, начинающаяся с символа d (номер события 12). |
!?mic? | Команда, содержащая подстроку mic (номер события 9). |
Такие выражения просто переносят команды, связанные с указанными событиями, без какого-либо изменения. Специальное выражение !! представляет собой ссылку на предыдущую команду; отдельная команда !! в строке ввода запускает предыдущую команду.
Для выбора отдельных слов из
команд, связанных с событиями, укажите событие с символом : и одну из
следующих ссылок на слово (слова в строке ввода последовательно нумеруются с
0):
Если ссылка на слово начинается с
символа ^, $, *, - или %, то двоеточие между указанием события и ссылкой на
слово можно опустить. За необязательной ссылкой на слово можно указать
последовательность следующих модификаторов, указав перед каждым из них
двоеточие:
В качестве левой части подстановки указывается не шаблон строки, применяемый в редакторе, а некоторое слово, представляющее собой единый блок без пробелов. Обычно в качестве разделителя между словами СтароеСлово и НовоеСлово указывается символ /. Однако в качестве разделителя можно задать любой символ. В следующем примере в качестве разделителя применяется символ %, поэтому символ / может выступать в качестве части слова:
s%/home/myfile%/home/yourfile%
Оболочка заменит выражение, состоящее из амперсанда (&), за которым указано СтароеСлово, на НовоеСлово. В следующем примере имя /home/myfile будет заменено на /temp/home/myfile.
s%/home/myfile%/temp&%
Пустое слово при подстановке
заменяется оболочкой на последнюю подстановку или на последнюю строку, которая
применялась в контекстном поиске
!?Строка?. Последний ограничитель
(/) можно опустить, если сразу за выражением следует символ новой
строки. Для изменения элементов списка хронологии применяются следующие
модификаторы:
Если модификатор g предшествует остальным модификаторам, то изменяется только первое указанное слово.
Если в ссылке на хронологию не задано событие (например, !$), то по умолчанию применяется предыдущая команда. Если предыдущая ссылка на хронологию задана в той же строке, то оболочка повторяет предыдущую ссылку. Например, следующая последовательность команд выбирает первый и последний аргумент команды, имя которой содержит строку ?foo?.
!?foo?^ !$
Строка ввода, которая начинается с символа ^, представляет собой специальный тип ссылки на хронологию. Это выражение эквивалентно команде !:s^, являясь короткой записью ссылки на текст предыдущей строки. Например, команда ^ lb^ lib исправляет ошибку в слове lib из предыдущей команды.
При необходимости подстановку хронологии можно заключить в { }, чтобы отделить ее от последующих символов. Например, если вы хотите задать ссылку на следующую команду:
ls -ld ~paul
для того, чтобы выполнить команду:
ls -ld ~paula
то укажите следующее выражение:
!{l}a
В данном примере команда !{l}a выполняет поиск команды, имя которой начинается с символа l, а затем добавляет к ней символ a.
Для отмены оставшихся подстановок заключите строку в одинарные или двойные кавычки. Если вы заключите строку в ' ' , то дальнейшая интерпретация символов строки выполняться не будет; если вы заключите строку в " " , то будет выполняться дальнейшая обработка строки. В обоих случаях результатом обработки строки или части строки будет одно слово.