Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 2:

Язык shell

Вызов командного интерпретатора shell

Вызов командного интерпретатора shell осуществляется командой

sh [опция...] [командный_файл [аргумент ...]]

или

sh -c [опция...] командная_цепочка 
       [имя_команды [аргумент ...]]

или

sh  -s [опция...] [аргумент ...]

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

Большинство опций команд sh и set (см. выше) совпадают. Им может предшествовать не только знак минус, но и плюс, что означает инвертирование их смысла. Из специфических опций команды sh выделим -i, предписывающую считать shell интерактивным. Shell будет интерактивным и тогда, когда команды читаются со стандартного ввода, направленного, как и стандартный протокол, на терминал.

Заданные в командной строке аргументы становятся значениями фактических аргументов $1, $2 и т.д. Если при наличии опции -c задано имя_команды, то в результате интерпретации командной цепочки оно становится значением $0.

Пример. Команда

sh -c 'echo $0 $1 $2' a b c

выдаст на стандартный вывод

a b c

Читателю предлагается самостоятельно определить, что выдаст на стандартный вывод похожая команда

sh -c "echo $0 $1 $2" a b c

(вместо одиночных кавычек для экранирования пробелов использованы двойные), и объяснить полученный результат.

Командный интерпретатор можно вызвать и из программы на языке C, воспользовавшись функциями system() или popen() (см. листинг 2.30):

#include <stdlib.h>
int system (const char *command);
#include <stdio.h>
FILE *popen (const char *command, 
             const char *mode);
Листинг 2.30. Описание функций system() и popen().

Аргумент command язык shell трактует как командную цепочку в вызове

sh -c command

и может содержать имя и аргументы любой выполнимой программы. При обращении к system() вызвавшая программа ожидает завершения выполнения переданной команды, а затем продолжает выполнение со следующего выполняемого оператора. Возвращаемое функцией system() значение - код завершения shell. Пример вызова функции system():

code = system 
       ("cd /usr/bin; ./ls > /tmp/lst");

Функция popen(), как и system(), вызывает выполнение указанной команды. Отличие в том, что при использовании функции popen() создается канал между вызвавшей ее программой и командой. Аргумент mode определяет, что программа будет делать с этим каналом: читать (" r ") или писать (" w ").

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?