Европейский Университет в Санкт-Петербурге
Опубликован: 04.07.2008 | Доступ: свободный | Студентов: 1309 / 258 | Оценка: 4.34 / 3.65 | Длительность: 21:13:00
Лекция 12:

Командные процессоры

< Лекция 11 || Лекция 12: 123456

Подстановка имен файлов. Шаблоны

При запуске программ из командной строки часто требуется передать им в качестве аргументов одно или несколько имен файлов. Часто эти имена удобно задать шаблоном – например, /var/log/messages.?, что означает "все файлы из каталога /var/log, имена которых начинаются на messages., а завершаются любым символом". Любой командный процессор умеет подставлять в командную строку имена файлов, соответствующие шаблону:

ls -l /var/log/messages.?

Символ "?" трактуется командным процессором как шаблон, которому соответствует один любой символ.

Обратите внимание на то, что командный процессор не понимает регулярных выражений. Его шаблоны похожи на регулярные выражения, но это – две совершенно разные песни. Для обработки регулярных выражений в любом приложении используется стандартная функция regex, а шаблоны имен файлов каждый командный процессор обрабатывает по-своему.

Командный процессор распознает и интерпретирует следующие символы в шаблонах (такие символы называются метасимволами, metasymbols или wildcards).

Таблица 12.7.
Метасимвол Смысл
* Любая подстрока, в том числе пустая.
? Один любой символ.
[...] Один любой символ из списка (например, [avgf]) или диапазона (например, [a-z])

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

Стало быть, если в текущем каталоге есть файлы money.c, money.bak, money.obj и wallet.x, то команда

ls –l money.*

будет раскрыта в

ls –l money.c money.bak money.obj

Подстановка результата выполнения

Иногда возникает необходимость отыскать в системе файлы по некоему признаку и со всеми этими файлами выполнить одинаковое действие: например, во всех файлах *.html заменить подстроку Siemens на Nixdorf. Если это требуется сделать только для файлов, лежащих в одном каталоге, то задача решается достаточно просто. Здесь мы приведем пример скрипта для Bourne Shell, но аналогичный скрипт легко написать и для других командных процессоров:

for i in *.html
do
sed 's/Siemens/Nixdorf/g' <$i >tmp
mv tmp $i
done

Переменная i последовательно принимает значения из списка, т.е. на каждой итерации цикла она имеет разное значение; список будет содержать имена всех файлов текущего каталога, соответствующих шаблону *.html.

Команда sed обеспечивает замену всех вхождений Siemens на Nixdorf, причем во входной поток sed перенаправляется содержимое очередного файла, в зависимости от значения переменной i. Результат направляется в файл tmp, а команда mv обеспечивает переименование файла tmp в нужное имя для замены старого файла из списка *.html новым.

Что делать, если такую процедуру надо проделать со всеми файлами *.html всего дерева каталогов, начиная с текущего каталога?

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

Итак, мы хотим найти все файлы *.html в поддереве файловой системы, начиная с текущего каталога.

Используем find для поиска:

find . -name "*.html"

Теперь воспользуемся конструкцией "подстановка результата выполнения" и перепишем наш скрипт для замены подстрок:

for i in ` find . -name "*.html" `
do
sed 's/Siemens/Nixdorf/g' <$i >tmp
mv tmp $i
done

Команда, заключенная в ` ` (обратные апострофы), выполняется первой, а результат ее выполнения подставляется в командную строку. Затем командная строка запускается на выполнение.

Завершение имен файлов

Функция "подсказки" (можно сказать также – "завершения") имен файлов (file name completion) позволяет набрать только часть имени существующего файла и затем нажать клавишу <Tab>. В ответ на это командный процессор "закончит" набор имени файла. Например, если надо обратиться к файлу /usr/sadm/admin/bin/printmgr, то достаточно набрать

/usr/sa<Tab>dm/a<Tab>dmin/b<Tab>in/pr<Tab>intmgr

Завершение имен файлов реализовано только в bash и tcsh.

Тем, в чьей системе есть файлы с длинными уникальными именами, подсказка имен файлов отлично экономит время.

При двойном нажатии <Tab> выводятся все возможные варианты завершения имени файла.

Например, если в каталоге есть два файла, начинающиеся с букв msg: msg01.txt и msg02.txt и надо просмотреть один из них, я набираю more msg<Tab><Tab>

Командный процессор bash (или tcsh) мне подскажет:

msg01.txt    msg02.txt

Теперь достаточно набрать еще цифру 1 или 2, чтобы указать, какой именно файл требуется, и еще раз нажать <Tab> для окончательного завершения имени. Если после двойного нажатия <Tab> bash видит слишком много возможных вариантов имен, он спросит:

There are 1102 possibilities. Do you really
wish to see them all? (y or n)

Стоит ответить n: так много имен не уместится на экран.

Средства редактирования командной строки

Редактировать командную строку приходится для того, чтобы исправить что-то в только что набранной строке. В sh нельзя передвинуть курсор в любую позицию в строке, в остальных командных процессорах – можно. Удобнее всего редактировать командную строку в bash.

В каждом командном процессоре реализованы стирание последнего символа клавишей <backspace> и стирание строки целиком комбинацией клавиш <Ctrl-U>.

В самых первых реализациях командных процессоров средства редактирования были еще более примитивными (например, удаление всей строки целиком выполнялось вводом @ и последующим вводом строки заново, при этом все набранные символы все равно оставались на экране). Сейчас такие архаические приемы редактирования не применяются ни в одном командном процессоре.

В bash и tcsh можно перемещаться вперед и назад по уже введенным символам в строке с помощью "стрелок", вводить знаки в середину и в начало строки. Командный процессор bash после нажатия Enter принимает всю строку целиком, независимо от того, в какой позиции строки находился курсор при нажатии Enter. Например, можно вернуть курсор к середине строки, если ввод оказался неверным, исправить ошибку и тут же нажать Enter, чтобы запустить команду на выполнение. В некоторых старых версиях командных процессоров в этом случае следует исправить строку, перейти к ее концу для ввода команды и только после этого нажать Enter.

В ksh редактирование по умолчанию выключено, его надо включить нажатием клавиши Esc4Редактирование командной строки будет работать корректно, только если терминал настроен правильно, а значение переменной среды окружения TERM совпадает с реальным типом терминала.. После этого командная строка будет редактироваться командами того редактора, имя которого задано в переменной среды окружения VISUAL или EDITOR. По умолчанию это редактор vi. Трудно найти такого системного администратора, которому такой громоздкий и неудобный способ исправления команд покажется удачным: ведь ко всему прочему ему придется помнить о переключении режимов редактирования строки ввода!

В csh и tcsh редактирование командной строки выполняется так же, как в bash.

< Лекция 11 || Лекция 12: 123456
Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Александр Васильченко
Александр Васильченко
Россия
Денис Гайдуль
Денис Гайдуль
Россия, Подольск