Грамматика команд shell

Простые команды

 

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

 

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

 

Возвращаемым значением простой команды является статус её выхода, либо 128+n команда завершается сигналом «n».

 

Перенаправления в shell

 

Перенаправлениями являются последовательности из одного либо нескольких команд, которые разделены одним из операторов управления | или |&.

 

[time [-p]] [ ! ] command [ [|⎪|&] command2 … ]

 

Стандартный вывод command здесь соединен, через канал в стандартный ввод command2. Данное соединение выполняется перед любым перенаправлением которое указано в команде. Использование |&, является стандартной ошибкой command подключается к стандартному вводу command2 через перенаправление, это сокращение к 2>&1 |. Такое не явное перенаправление стандартной ошибки выполняется после любых перенаправлений которые указаны в команде.

 

Состояние возврата из перехода является состояние выхода последней команды, если не включен параметр «pipefail». Если же параметр «pipefail» включен, тогда состояние возврата перехода является значение последней команды (крайней справа) для выхода с нулевым статусом, либо же ноль в том случае если все команды успешно завершились. Если же переходу предшествует зарезервированное слово «!», статус выхода такого перехода является логическим отрицанием статуса выхода, как это было описано выше. Shell ждет завершение всех команд в конвейере, перед тем как возвратить значение.

 

Если зарезервированное слово time предшествует перенаправлению, то использованное, а так же системное время затраченное его выполнение, сообщается когда переход завершается. Параметр -p изменяет выходной формат, на заданное в POSIX. Когда shell находится в POSIX режиме, она не признает зарезервированное слово time, если следующий символ начинается с «». Переменная TIMEFORMAT может быть установлена в формате строки, которая определяет сроки, в которые информация должна отображаться: описание TIMEFORMAT будет описано в дальнейших статьях.

 

Когда shell находится в posix режиме, time может быть переходом к новой строке. В этом случае оболочка отображает общее пользовательское и системное время, потребляемое shell. Переменная TIMEFORMAT может быть использована для определения формата информации о времени.

 

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

 

Списки в shell

 

Список представляет собой последовательность из одного или нескольких переходов разделенных одним из операторов «;», «&», «&&», или «||» и не обязательно, завершается одним из «;», «&», или «».

 

Эти операторы имеют одинаковый приоритет, «&&» и «||», следом так же одинаковый приоритет имеют «;» и «&».

 

Последовательность из одного или нескольких символов новой строки могут, появится в списке, вместо точки с запятой, для разделения команд.

 

Если команда завершается оператором управления «&» shell выполняет команду в фоновом режиме, в подоболочке. Shell не дожидается завершения конца команды и возвращает статус равный 0. Команды разделенные «;» выполняются последовательно, shell ожидает завершения каждой команды. Статусом возврата является статус выхода последней выполненной команды.

 

«И» и «ИЛИ» списки представляют собой последовательности одного или более переходов, разделенных «&&» и «||» операторов управления соответственно. «И» и «ИЛИ» списки выполнены с левой ассоциатавностью.

 

«И» списки имеют вид.

 

command1 && command2

 

command2 выполняется только если command1 возвращает нулевое состояние на выходе.

 

«ИЛИ» списки имеют вид.

 

command1 || command2

 

command2 выполняется только тогда когда command1 возвращает нулевой статус. Статусом возврата «И» и «ИЛИ» списков является статус выхода последней выполненной команды в списке.

 

Составные команды в shell

 

Соединить команды можно одним из следующих способов:

 

(list)

Список выполняется в среде порожденного командного интерпритатора. Значение переменных, а так же встроенных команд, которые влияют на окружающую среду оболочки не остаются в силе после завершения команды. Статусом возврата является статус выхода списка.

 

{ list; }

Список команд выполняется в текущей среде оболочки. Список завершается с новой строки или точкой с запятой. Это является группой команд. Статусом возврата является статус выхода списка. Стоит обратить внимание что в отличие от метасимволов (и), {и} являются зарезервированными словами и должны находится там где зарезервированные слова разрешено признавать. Так как они не вызывают слова перерыва, они должны отделяться от списка пробелами либо каким либо другим командным метасимволом.

 

((expression))

Выражение вычисляется в соответствии с правилами, которые будут описаны мною в дальнейшем в ARITHMETIC EVALUATION. Если значение выражения не равняется нулю, то возвращается статус 0, если выражение равно нулю тогда возвращается статус 1. Это в точности соответствует «expression».

 

[[ expression ]]

Возвращаемое значение 0 либо 1 зависит от оценки условного выражения «expression». Выражения состоят из предварительных условных выражений которые будут описаны мной в будущем CONDITIONAL EXPRESSIONS. Разделение на слова, и подстановку имен файлов не производится на словах между [[и]]; выполняются же тильды, параметры и переменные, арифметические выражения, подстановки команд, процесс замещения и удаления кавычек.

 

При использовании с [[, <и> лексикографическим оператором сортировки с использованием текущей локали.

 

Описание команд встроенного текста, я буду описывать в дальнейших статьях в SHELL BUILTIN COMMANDS.

 

Когда используются операторы «==» и «!=», строка справа от оператора считается шаблоном и подбирается в соответствии с правилами, которые я буду описывать в своих дальнейших статьях Pattern Matching. Если включен параметр nocasematch, совпадения проводятся без учета регистра алфавитных символов. Возвращается значение равное 0, если строка соответствует модели (==) или не соответствует (!=), и 1 в противном случае. Любая часть шаблона может быть заключена в кавычки, для того чтобы заставить её соответствовать строке.

 

Дополнительный бинарный оператор «=~» существует с тем же приоритетом что и «==» и «!=». Когда он используется, строка справа от оператора считается расширенным регулярным выражением и соответственно подобранна. Возвращается значение 0, в том случае если строка соответствует шаблону и 1 в противном случае. Если же регулярное выражение синтаксически некорректно, возвращается значение условное выражение равное 2. Если включен параметр nocasematch, совпадения проводятся без учета регистра алфавитных символов. Любая часть шаблона может быть заключена в кавычки, для того чтобы заставить её соответствовать строке. Подстроки сопровождаются скобками, подвыражения внутри регулярного выражения сохраняются в переменной массива BASH_REMATCH. Элемент BASH_REMATCH с индексом 0 является частью строки соответствующей всем регулярным выражениям. Элемент BASH_REMATCH с индексом n, является частью соответствия строки, скобки подвыражения.

 

Выражения могут быть объединены, при использовании следующих операторов, перечисленных в порядке убывания приоритета:

 

( expression )

Возвращает значение выражения. Это может быть использовано для переопределения обычного приоритета операторов.

 

! expression

Истинно в том случае если выражение ложно.

 

expression1 && expression2

Истинно если оба выражения правильны.

 

expression1 || expression2

Истинно если одно из выражений истинны.

 

Операторы «&&» и «||» не проводит оценку expression2 если значение expression1 достаточно для определения возвращаемого значения всего условного выражения.

 

for name [ [ in [ word … ] ] ; ] do list ; done

Список слов следующих в расширении, создают список элементов. Имя переменной установлено в каждом элементе этого списка по очереди, список будет, выполнятся каждый раз. Если слово пропущено, команды выполняют список только один раз для каждого установленного позиционного параметра. Статусом возврата является статус выхода последней команды, которая выполняется. Если результаты расширенных пунктов, следуют в пустой список, никакие команды не выполняются и возвращается статус 0.

 

for (( expr1 ; expr2 ; expr3 )) ; do list ; done

Первое арифметическое выражение «expr1» оценивается в соответствии с правилами ARITHMETIC EVALUATION, которые я буду описывать в следующих статьях. Затем оценивается арифметическое выражение «expr2», до тех пор пока оно не примет значение равное нулю. Каждый раз как «expr2» вычисляется в нулевое значение, список обрабатывает и арифметическое выражение «expr3». Если какое-либо выражение пропущено, он ведет себя так как будто имеет значение 1. Возвращаемым значением является статус выхода последней команды в списке, которая будет выполнена или не выполнена если какое-либо из выражений является недопустимым.

 

select name [ in word ] ; do list ; done

Список слов следующих в расширении, создает список элементов. Набор расширенных слов печатается на стандартную ошибку, каждого предшествующего номера. Если какое-либо слово пропущено, печатаются позиционные параметры. Приглашение PS3 будет отображено на строку стандартного ввода. Если строка содержит число соответствующее одному из отображаемых слов, то значение имени устанавливается для этого слова. Если же строка является пустой, то слова и приглашение снова отображаются. Если читается «EOF» конец файла, то команда завершается. Любое другое читаемое значение вызывает имя которому будет присвоено значение равное нулю. Список чтения сохраняется в переменной REPLY. Список выполняется после каждого выбора до тех пор пока не прерываются команды. Статусом выхода является статус выхода последней выполненной команды в списке либо ноль, если ни одна из команд не была выполнена.

 

case word in [ [(] pattern [ | pattern ] … ) list ;; ] … esac

Здесь первая команда case расширяет слово (word) и пытается сопоставить его с каждым шаблоном(pattern), по очереди, используя те же правила сопоставления что для имен файлов. Слово (word), расширяется при помощи тильды, параметров и переменных, арифметической замены, подстановки команд, процесса замещения и удаления кавычек. Каждый рассмотренный шаблон (pattern) расширяется при помощи тильды, параметров и переменных, арифметической замены, подстановки команд и подстановки процессов. Если в shell включен параметр nocasematch, то совпадения проводятся без учета регистра алфавитных символов. Если совпадение найдено, соответствующий список выполняется. Если используется оператор «;;» то никакие последующие совпадения не будут искаться после первого совпадения с шаблоном (pattern). Использование «;&» вместо «;;» вызывает продолжение выполнения списка связанного со следующим набора шаблонов(pattern). Использование «;;&» вместо «;;» заставит shell проверить следующий список шаблонов(pattern) в команде, если таковой имеется и выполнить любой связанный список на успешное совпадение. Если совпадений с шаблонами(pattern) не обнаружено, то статус выхода равен нулю. В ином же случае статус выхода команды равен выходу последней команды в списке.

 

if list; then list; [ elif list; then list; ] … [ else list; ] fi

if list будет выполнен. Если статус выхода равен нулю, то выполнится then list. В ином же случае каждый elif list в свою очередь выполнится, и если его статус выхода равен нулю, то соответствующий then list выполняется и команда завершается. В противном же случае выполняется else list если он присутствует. Статусом выхода команды, является статус выхода последней выполненной команды, или ноль, если ни одно из условий не выполнено.

 

while list-1; do list-2; done

until list-1; do list-2; done

Команда while непрерывно выполняет list-1 list-2, пока последняя команда в list не возвращает нулевое состояние на выходе. Команда until идентична команде while, за исключением того что list-2 выполняется когда команда list-1 возвращает нулевой статус выхода. Статус выхода команды while и until является статус выхода последней выполненной комады в list-2, или ноль, если ни один не был выполнен.

 

Coprocesses

 

Coprocess является командой shell которой предшествует зарезервированное слово coproc. Coprocess выполняется асинхронно в подоболочке, а если команда были прекращены с контрольным оператором &, с двусторонним конвейером установленым между выполнением shell и coprocess.

 

Формат для coprocess выглядит:

 

coproc [NAME] command [redirections]

 

Это создает coprocess имя NAME. Если имя не установлено по умолчанию имя COPROC. Имя не должно указываться если команда является простой, в противном случае она интерпретируется как первое слово простой команды. Когда выполняется coproc, shell создает массив переменной(Массивы я опушу в будущем) с указанным именем NAME в контексте выполнения shell. Стандартный вывод команды сообщается через конвейер в дескриптор файла с исполняющем shell, и файловый дескриптор присваивает NAME[0]. Стандартный ввод команды сообщается через конвейер в дескриптор файла в исполняющем shell, и файловый дескриптор присваивает NAME[1]. Этот конвейер устанавливается перед любым перенаправлением указанным в команде(описание перенаправлений я буду описывать в дальнейшем). Файлы дескрипторов могут быть использованы в качестве аргументов shell и перенаправления с использованием стандартных расширений слов. Идентификатор процесса ID shell породила выполнение coprocess доступного как значение переменной NAME_PID. Встроенная команда ожидания wait может быть использована для ожидания окончания coprocess.

 

Статус возврата coprocess является статус выхода из команды.

 

Определения функции shell

 

Функции shell является объектом, который называется как простая команда и выполняет составную команду с новым набором позиционных параметров. Shell функции объявляются следующим образом:

 

name () compound-command [redirection]

function name [()] compound-command [redirection]

Это определяет функцию с именем name. Зарезервированному слову функция не обязательна. Если функции передается зарезервированное слово, круглые скобки не обязательны. Телом функции является составная команда, соединения команд(смотрите выше Составные команды). Как правило, это список команд между {и}, но может быть любой командой из перечисленных в разделе Составные команды выше. Соединение команд выполняется всякий раз, когда name указывается как имя простой команды. Любые перенаправления(их я описывать буду в последующих статьях) указанные в определении функции выполняются при выполнении функции. Статус выхода определения функции равен нулю, если при возникновении синтаксической ошибки только для чтения, или функции с таким же уже существующим именем. При выполнении статуса выхода функции, является статус выхода последней выполненной команды в теле. (Функции я буду описывать в дальнейших статьях)

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

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