Изучение командного интерпретатора UNIX Shell

Лабораторная работа № 3

Цель работы: ознакомление с базовыми правилами создания и применения командных скриптов в Unix.

Краткий обзор:

Командный интерпретатор Shell это обычная прикладная программа, выполняющая команды пользователя, задаваемые либо в интерактивном (диалоговом) режиме, либо в виде командных файлов, называемых также скриптами.

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

Базовой конструкцией языка shell является простая команда. Она состоит из имени команды и, если это необходимо, параметров, разделенных пробелами. Имя команды – это обычно имя исполняемого файла (либо двоичной программы, либо Shell-скрипта).

 

Перенаправление ввода/вывода

Большинство команд UNIX выводят результат своей работы в текстовом виде на устройство стандартного вывода. По умолчанию это означает, что результаты выводятся на монитор пользователя. Однако стандартный вывод легко может быть перенаправлен в файл или на устройство. Для этого в команде используются символы ‘>’ и ‘>>’.

Например, если набрать в командной строке команду:

man cp > 1.txt,

справка по команде cp будет записана в файл 1.txt, при этом файл 1.txt будет создан заново, даже если файл с таким именем уже существует. Если же выполнить команду:

man cp >> 1.txt,

справка по команде cp будет дописана в конец существующего файла 1.txt.

Многие команды используют также стандартный ввод (хэндл 0), который по умолчанию означает данные, вводимые с клавиатуры терминала. Признаком конца ввода служит комбинация Ctrl+D. Стандартный ввод также может быть перенаправлен для чтения данных из файла или с устройства (с помощью символа ‘<’), или даже непосредственно из текста команды.

Для выполнения команды shell запускает отдельный процесс. Результатом выполнения команды является код завершения процесса, который может затем быть проанализирован. Нулевое значение кода обычно означает нормальное завершение, значение, большее нуля – ошибку.

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

Конвейер означает параллельное выполнение нескольких команд с передачей данных по мере их обработки от одной команды к следующей. Запись конвейера состоит из нескольких команд, разделенных знаками ‘|’. Для выполнения конвейера шелл запускает одновременно процессы для каждой команды, при этом стандартный вывод каждой команды перенаправляется на стандартный ввод следующей.

Например, если необходимо вывести содержимое файла big_text:

cat big_text,

но в нем много строк и пользователь не успеет его прочитать, целесообразно отправить вывод команды cat какой-то программе, которая будет выводить его постранично:

cat big_text | more

Список означает последовательное выполнение команд. Он состоит из нескольких команд, разделенных знаками ‘;’, ‘&&’ или ‘||’. Если две команды разделены знаком ‘;’, то следующая команда запускается после завершения предыдущей. Если команды разделены знаком ‘&&’, то следующая будет выполняться только в том случае, если код завершения предыдущей равен 0 (нормальное завершение). Напротив, знак ‘||’ означает, что следующая команда будет выполняться только в том случае, если код завершения предыдущей не равен 0 (завершение с ошибкой).

Если запись команды заканчивается символом ‘&’, то Shell запускает процесс ее выполнения в фоновом режиме, т.е. не дожидается завершения процесса, а переходит к следующей команде. При этом фоновый процесс продолжает работать параллельно с командным интерпретатором и запускаемыми им другими командами. Фоновый процесс не имеет доступа к терминалу.