Материал: 6261

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

66

3.6 Специальные символы и имена файлов

Shell интерпретирует команды и аргументы команд как слова.

Следующие символы, если они не экранированы, завершают предыдущее слово:

; & ( ) | ^ < > пробел табуляция перевод_строки

Эти символы могут экранироваться одинарными или двойными кавычками.

•двойные кавычки могут экранировать одинарную кавычку;

•двойные кавычки не мешают подстановке параметров.

Символ \ используется для экранирования одиночных символов и удаляется из слова перед выполнением команды, но сам экранируется одинарными кавычками.

Вкомандах, работающих с именами файлов, возможно использование шаблонов:

•* сопоставляется с произвольной цепочкой символов, в том числе и пустой;

•? сопоставляется с произвольным символом;

•[...] сопоставляется с любым, перечисленным в скобках символом. Пара символов, разделенных знаком -, рассматривается как отрезок алфавита.

Если за [ стоит знак !, то шаблону удовлетворяет любой символ, не перечисленный в скобках.

Примеры использования шаблонов:

•ls .. - вывод списка файлов родительского каталога;

•ls . - вывод списка файлов текущего каталога (каталог, в котором находится пользователь);

•ls .* - вывод всех списка файлов и списка содержимого каталогов, с

именами начинающимися с «точки», для текущего каталога (каталог, в котором находится пользователь);

•ls .x* - вывод списка имен файлов, начинающихся с .x, для текущего каталога;

•ls .[a-c,x]* - вывод списка имен файлов, начинающихся с .a, .b, .c, .x, для текущего каталога;

•ls .config — вывод списка имен каталога .config;

•ls .config/* — вывод списка имен файлов каталога .config и его каталогов.

Замечание

Не следует надеяться на интуицию!

Обязательно следует проверить результаты вывода шаблонов в командной строке терминала.

67

3.7 Стандартный ввод/вывод и переадресация

Типичный процесс, показанный ранее на рисунке 1.1, читает данные с клавиатуры (дескриптор файла 0) и выводит данные на экран терминала (дескрипторы файлов 1 и 2).

В случае, когда для чтения и записи данных используются другие источники информации, применяются следующие правила перенаправления (переадресации) ввода и вывода:

<слово

Использовать файл слово для стандартного ввода (дескриптор файла 0).

>слово

Использовать файл слово для стандартного вывода (дескриптор файла 1). Если файла нет, он создается; если есть, он опустошается.

>>слово

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

<<[-]слово

Читается информация со стандартного ввода, пока не встретится строка, совпадающая со словом, или конец файла. Если после << стоит -, то сначала из слова, а затем, по мере чтения, из исходных строк удаляются начальные символы табуляции, после чего проверяется совпадение строки со словом. Если ка- кой-либо из символов слова экранирован, никакой другой обработки исходной информации не производится; в противном случае делается еще следующее:

1.Выполняется подстановка параметров и команд.

2.Пара символов \перевод_строки игнорируется.

3.Для экранирования символов \, $, ` нужно использовать \.

Результат описанных выше действий становится стандартным вводом команды.

<&цифра

Производить стандартный ввод из файла, ассоциированного с дескриптором цифра.

68

>&цифра

Производить стандартный вывод в файл, ассоциированный с дескриптором цифра.

<&- Стандартный ввод команды закрыт.

>&- Стандартный вывод команды закрыт.

цифра<&- Закрыть ввод дескриптора цифра.

цифра>&- Закрыть вывод дескриптора цифра.

Если любой из этих конструкций предшествует цифра, она определяет дескриптор (вместо подразумеваемых дескрипторов 0 или 1), который будет ассоциирован с файлом, указанным в конструкции. Например, строка

... 2>&1

ассоциирует дескриптор 2 (стандартный протокол) с файлом, связанным в данный момент с дескриптором 1.

Важен порядок переназначения: shell производит переназначение слева направо. Так, строка

... 1>f 2>&1

сначала ассоциирует дескриптор 1 с файлом f, а затем дескриптор 2 с тем же файлом. Если изменить порядок переназначения, стандартный протокол будет назначен на терминал (если туда был назначен стандартный вывод), а затем стандартный вывод будет переназначен в файл f.

Если команда состоит из нескольких простых команд, переназначение для всей команды будет выполнено перед переназначениями для простых команд. Таким образом, shell выполняет переназначения сначала для всего списка, за тем для каждого входящего в него конвейера, затем для

каждой команды конвейера, затем для каждого списка из каждой команды.

Если команда заканчивается знаком &, то стандартный ввод команды переназначается на пустой файл /dev/null. В противном случае, окружение для выполнения команды содержит дескрипторы файлов запустившего ее shell'а, модифицированные спецификациями ввода/вывода.

69

Замечание

Следует очень внимательно работать с перенаправлениями, поскольку они являются разделителями прав доступа. Например, две команды, подключающие архив студента к рабочей области ОС УПК АСУ, являются разными по правам доступа и не обеспечивают нужный результат:

gzip -cdvk /run/media/FC99-4744/asu64upk/themes/os-home.ext4fs.gz > \ /run/basefs/asu64upk/themes/os-home.ext4fs

sudo gzip -cdvk /run/media/FC99-4744/asu64upk/themes/os-home.ext4fs.gz > \ /run/basefs/asu64upk/themes/os-home.ext4fs

Хотя вторая команда подвергается воздействию команды sudo, ее действие распространяется только до оператора перенаправления, что не позволяет записывать результат на защищенные устройства.

Чтобы устранить указанный недостаток, используются отдельные сценарии from-gzip

и to-gzip, содержимое которых показано на рисунках 3.5 и 3.6. Применение команды sudo к сценарию обеспечивает командам нужный уровень привилегий.

Рисунок 3.5 — Сценарий распаковки архива темы

Рисунок 3.6 — Сценарий сжатия рабочей области и записи его в нужное место

70

3.8 Программные каналы

Рассмотренные выше метаопределения и элементарные понятия языка shell, опираются на понятие простой команды.

Простая команда - это последовательность слов, разделенных пробелами: Первое слово определяет имя команды, которая будет выполняться, а остав-

шиеся слова передаются команде в качестве аргументов. Имя команды передается как аргумент 0 [см. exec(2)].

Значение простой команды - это ее код завершения: 0 - если она выполнилась нормально, или (128 + код ошибки), если ненормально [см. также signal(2)].

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

Каналы — специальные файлы ОС, создаваемые посредством системного вызова pipe(...) и служащие для организации обмена данными (сообщениями) между процессами (программами).

В языке shell, для организации программных каналов между простыми командами, используется понятие конвейер.

Конвейер - это последовательность команд, разделенных знаком |. При этом:

Стандартный вывод всех команд, кроме последней, направляется посред-ством системного вызова pipe(2) на стандартный ввод следующей команды конвейера.

Каждая команда выполняется как самостоятельный процесс.

shell ожидает завершения последней команды. Ее код завершения станови-тся

кодом завершения конвейера.

Список - это последовательность одного или нескольких конвейеров, разделенных символами ;, &, && или || и, быть может, заканчивающаяся символом ; или &.

Из четырех указанных операций:

• ; и & имеют равные приоритеты, меньшие, чем у && и ||.

•

Приоритеты последних также равны между собой.

• Символ ; означает, что конвейеры будут выполняться последовательно.

•

Символ & означает, что конвейеры будут выполняться параллельно (то есть

 

shell не ожидает завершения конвейера).

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

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

•В списке, в качестве разделителя конвейеров, вместо символа ; можно использовать символ перевод строки.

Источник: https://studfile.net/preview/16438529/