Вызов командного интерпретатора 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(). (html, txt)
Аргумент command язык shell трактует как командную цепочку в вызове
sh -c command
и может содержать имя и аргументы любой выполнимой программы. При обращении к system() вызвавшая программа ожидает завершения выполнения переданной команды, а затем продолжает выполнение со следующего выполняемого оператора. Возвращаемое функцией system() значение - код завершения shell. Пример вызова функции system():
code = system ("cd /usr/bin; ./ls > /tmp/lst");
Функция popen(), как и system(), вызывает выполнение указанной команды. Отличие в том, что при использовании функции popen() создается канал между вызвавшей ее программой и командой. Аргумент mode определяет, что программа будет делать с этим каналом: читать ("r") или писать ("w").