Возможности командной оболочки linux
Если входные данные не закомментированы, командная оболочка прочитает их и разделит их на слова и операторы с учетом использования кавычек, с помощью которых задается смысл каждого элемента входных данных. Затем эти слова и операторы транслируются в команды и другие конструкции, возвращающие статусы завершения, которые можно будет проверять или обрабатывать. Описанная ранее схема создание нового процесса и его выполнения fork-and-exec будет использована только после того, как командная оболочка следующим образом проанализирует входные данные:
- Командная оболочка считывает информацию из файла, из строки или из терминала пользователя.
- Входные данные разбиваются на слова и операторы с учетом правил использования кавычек, смотрите главу 3 «Среда окружения Bash». Эти лексемы разделяются между собой с помощью метасимволов. Выполняется подстановка алиасов.
- Оболочка в простых командах и в сложных составных командах выполняет синтаксический анализ лексем (анализирует и выполняет подстановки).
- Bash выполняет различные дополнительные действия, которые включены в командной оболочке: преобразовывая лексемы в списки имен файлов и команды и в списки аргументов.
- Если необходимо, выполняется перенаправление; операторы перенаправления и их операнды удаляются из списка аргументов.
- Выполняются команды.
- Дополнительно оболочка может ждать, пока команда будет завершена, и может получить ее статус завершения.
Команды командной оболочки
Простая команда оболочки, такая как touch file1 file2 file3 , состоит из самой команды, за которой следуют аргументы, разделенные пробелами.
Более сложные команды оболочки состоят из простых команд, которые объединены друг с другом различным образом: с помощью конвейера, когда выход одной команды подключается ко входу второй команды, с помощью цикла, с помощью условной инструкции или еще каким-нибудь образом. Пара примеров:
ls | more gunzip file.tar.gz | tar xvf -
Функции командной оболочки
Функции командной оболочки являются способом создания групп команд, выполнение которых впоследствии будет осуществляться обращением к единому для всей группы команд имени. Выполнение группы команд будет осуществляться точно так же, как и «обычных» команд. Когда имя функции используется в качестве имени простой команды, будут выполнены все команды в списке, связанном с именем этой функции.
Функции командной оболочки выполняются в контексте текущей оболочки; для их интерпретации новый процесс не создается.
Функции объясняются в главе 11 «Функции».
Параметры командной оболочки
Параметр — это сущность, в которой хранятся значения. Это может быть имя, номер или специальное значение. В случае с командными оболочками переменная является параметром, который запоминается по имени. Переменная имеет значение и может содержать ноль или большее количество атрибутов. Переменные создаются с помощью встроенной команды declare.
Если значение не задано, переменной присваивается строка со значением null. Переменные могут быть удалены только с помощью встроенной команды unset.
Присваивание значений переменным обсуждается в разделе «Переменные», дополнительные возможности использования переменных рассматриваются в главе 10 «Подробнее о переменных».
Расширенные возможности командной оболочки
После того, как командная строка будет разбита на лексемы, к ней применяются дополнительные действия (или расширения — shell expansions). Это следующие действия:
- раскрытие фигурных скобок;
- замена символа «тильда»;
- подстановка параметров и переменных;
- подстановка команд;
- раскрытие арифметических выражений;
- разбиение на отдельные слова;
- подстановка имен файлов.
Мы подробно обсудим эти типы дополнительных действий «Расширения командной оболочки».
Перенаправление данных
Перед тем, как команда будет выполнена, ее входной и выходной потоки могут быть перенаправлены с помощью специальной нотации, интерпретируемой командной оболочкой. Перенаправление можно также использовать с тем, чтобы открывать и закрывать файлы в текущей среде исполнения командной оболочки.
Выполнение команд
Когда команда выполняется, та ее часть, которую парсер определяет как присваивание значений переменным (предшествующее имени команды) и перенаправление данных, сохраняются для последующего использования. Для той части команды, которая не участвует в присваивании значений переменным или в перенаправлении данных, выполняются все необходимые дополнительные действия; первое слово, оставшееся после выполнения действий, рассматривается как имя команды, а оставшаяся часть является аргументами этой команды. Затем выполняются действия по перенаправлению данных, затем переменным назначаются строковые значения. Если имени команды нет, то переменные изменят текущую среду командной оболочки.
Важной частью задач, которые выполняет командная оболочка, является поиск команд. Bash делает это следующим образом:
- Проверяется, содержит ли команда слэши, Если нет, то сначала проверяется список функций с тем, чтобы увидеть, есть ли в нем команды с искомым именем.
- Если команда не является функцией, то она ищется в списке встроенных команд.
- Если команда не является ни функцией, ни встроенной командой, то она ищется в директориях, перечисленных в переменной PATH . Для того, чтобы сократить затраты, связанные с поиском путей, указанных в PATH , в bash для запоминания полных путей к именам исполняемых модулей используются хеш-таблицы (область хранения данных расположена в памяти).
- Если поиск оказался неудачным, то bash выдает сообщение об ошибке и выдает код возврата, равный 127.
- Если поиск оказался успешным, или если в команде есть слэши, то командная оболочка выполняет команду в отдельной среде окружения.
- Если выполнение невозможно из-за того, что файл не является исполняемым и не директорий, то предполагается, что это скрипт.
- Если команда не начала выполняться асинхронно, командная оболочка будет ожидать завершение исполнения команды и получит код возврата.
Скрипты командной оболочки
Когда файл, содержащий команды оболочки, используется при вызове Bash в качестве первого аргумента без параметров (т. е. без -c или -s ), будет создана неинтерактивная оболочка. Эта оболочка сначала ищет файл со скриптом в текущем директории и, если он там не будет найден, ищет его затем с использованием переменной PATH .
Предыдущий раздел: | Оглавление | Следующий раздел: |
Исполнение команд | Разработка хороших скриптов |