shell", що поєднує все краще з інших інтерпретаторів із зручними можливостями редагування командного рядка і роботи з історією команд. В даний час - фактичний стандарт. p> Розглянемо структуру командного рядка інтерпретаторів sh і ksh (в класичній версії 1988 року).
Командні рядки розглядаються по одній і мають певну структуру. Щоб зрозуміти її, розглянемо ряд синтаксичних визначень:
<пробіл>: =
<символ пропуску> | <символ табуляції>
<ім'я>: =
<буква або підкреслення> {<допустимий символ імені>}
<буква або підкреслення>: =
<буква> | _
<допустимий символ імені>: =
<буква> | <цифра> | _
<параметр>: =
<ім'я> | <цифра> | * | @ | # |? | - | $ |! p> <слово>: =
В«не пробіл> {В« не пробіл>}
<проста команда>: =
<слово> {<пробіл> <слово>}
Отже, проста команда - це послідовність слів через пропуск. Натискання клавіші Enter при введенні команди або переклад рядка при обробці сценарію є для командного інтерпретатора ознакою завершення команди. Вона обробляється і виконується. p> Значним простої команди є її статус виходу (див. далі) у разі нормального завершення або (вісімкове) 200 + статус при ненормальному завершенні.
Приклад простої команди:
$ who
oracle pts000 Aug 20 10:08 console Aug 20 9:03 pts004 Aug 20 12:45
$
З простих команд будуються більш складні конструкції: конвеєри і списки.
<конвеєр>: =
<команда> {| <команда>}
<список>: =
<конвеєр> {<роздільник> <конвеєр>} [<термінатор команди>]
<роздільник>: =
&& | | | | <термінатор команди>
<термінатор команди>: =
; | &
Конвеєр - це послідовність однієї або більше команд, розділених |. Стандартний вихідний потік кожної команди, крім останньої, з'єднується за допомогою програмного каналу зі стандартним вхідним потоком наступної команди. Кожна команда виконується як окремий процес; інтерпретатор очікує закінчення останньої команди. Статусом виходу конвеєра є статус виходу його останньої команди. Ось приклад простого конвеєра:
$ ls | tee save | wc
15 15 100
$
Список - це послідовність одного або більше конвеєрів, розділених;, &, && або | | і, можливо, що закінчується; або &. З цих чотирьох символів,; і & мають рівний пріоритет, який нижче, ніж у && і | | (ці символи теж мають рівний пріоритет). Крапка з комою (;) викликає послідовне виконання попереднього конвеєра (тобто командний інтерпретатор очікує закінчення конвеєра перед виконанням будь-яких команд, наступних за крапкою з комою). Амперсанд (&) викликає асинхронне виконання попереднього конвеєра (тобто командний інтерпретатор не очікує закінчення роботи конвеєра). Символ && (| |) веде до того, що наступний за ним список виконується тільки в тому випадку, коли попередній конвеєр повернув нульовий (не...