Операционная система UNIX - страница 34
2. Производит подстановки, а именно:
• Заменяет все указанные переменные их значениями. Например, если значение переменной var равно /usr/bin, то при вызове команды >find $var -name sh -print
переменная >$var
будет заменена ее значением. Другими словами, фактический запуск команды будет иметь вид:
>find /usr/bin -name sh -print
• Формирует списки файлов, заменяя шаблоны. При этом производится подстановка следующих шаблонов:
* — соответствует любому имени файла (или его части), кроме начинающихся с символа '.',
[abc] — соответствует любому символу из перечисленных (а или b или с),
? — соответствует любому одиночному символу.
3. Делает соответствующие назначения потоков ввода/вывода. Если в строке присутствуют символы перенаправления (>, <, >>, <<, |), shell производит соответствующее перенаправление потоков. Программный интерфейс ввода/вывода мы рассмотрим в разделе "Работа с файлами" следующей главы.
4. Выполняет команду, передавая ей аргументы с выполненными подстановками. При этом:
• Если команда является функцией, определенной пользователем, вызывается функция.
• В противном случае, если команда является встроенной командой shell, запускается встроенная команда.
• В противном случае производится поиск программы в каталогах, указанных переменной $PATH, если имя команды задано без пути. Если имя команды задано явно, т.е. содержит элементы пути (относительный или абсолютный путь), производится запуск программы. В случае, если программа не найдена, выводится сообщение об ошибке.
Описанные подстановки, выполняемые интерпретатором, следует иметь в виду при запуске команд. Например, запуск команды rm приведет к удалению всех файлов данного каталога:
>$ ls
Вывести список файлов каталога
>a.out client client.с
>server server.с shmem.h
>$ rm *
Удалить файлы
>$ ls
>$
Каталог пуст
Команда rm(1) без колебаний выполнит свою функцию, поскольку в качестве аргументов она получит обычный список файлов. Замену символа '*' на список всех файлов каталога произведет shell, и rm(1) трудно догадаться, что вы собираетесь удалить все файлы. Реальный же вызов rm(1) будет иметь вид:
>rm a.out client client.с server server.с shmem.h
Точно так же запускаемые программы ничего не знают о перенаправлении потоков ввода/вывода, произведенных командным интерпретатором. Напомним, что перенаправление ввода/вывода возможно лишь для стандартных потоков ввода, вывода и сообщений об ошибках. Впрочем, большинство утилит UNIX используют только стандартные потоки.
Запуск команд
Как уже говорилось, запускаемые команды могут являться либо функциями, определенными пользователем, либо встроенными командами интерпретатора, либо исполняемыми файлами — прикладными программами и утилитами. В любом случае, синтаксис их вызова одинаков.
Если необходимо запустить сразу несколько команд, это можно сделать в одной строке, разделив команды символом ';'. Например:
>$ pwd; date
>Apr 18 1997 21:07
Заметим, что команды будут выполнены последовательно: сначала выполнится команда pwd(1), которая выведет имя текущего каталога, а затем date(1), которая покажет дату и время.
Можно запустить программу в фоновом режиме. В этом случае shell не будет ожидать завершения выполнения программы, а сразу выведет приглашение, и вы сможете продолжить работу в командном интерпретаторе. Для этого строку команды необходимо завершить символом '&':
>$ find -name myfile.txt.1 -print >/tmp/myfile.list 2>/dev/null &
>$
Пока утилита find(1) производит поиск файла с именем myfile.txt.1, сканируя файловую систему, вы сможете выполнить еще массу полезных дел, например, отправить почту или распечатать документ на принтере. Мы вернемся к этой схеме запуска программ далее в этой главе при обсуждении системы управления заданиями.
Наконец, командный интерпретатор предоставляет возможность условного запуска команд. Например, если необходимо выполнить команду только в случае успешного завершения предыдущей, следует воспользоваться следующей синтаксической конструкцией:
>cmd1 && cmd2
В качестве примера рассмотрим поиск имени пользователя в файле паролей, и в случае успеха — поиск его имени в файле групп: