Краткое введение в программирование на Bash - [9]

Шрифт
Интервал

>fi

Теперь, когда вы запустите скрипт, он будет перехватывать и анализировать код завершения grep. Если он равен 0, значит пользователь найден и мы выводим соответствующее сообщение об ошибке. В противном случае скрипт напечатает, что пользователя найти не получилось. Это очень простой способ использования получаемого кода завершения программы. По мере практики вы сами будете понимать, для решения какой задачи вам нужно использовать эти коды завершения.

Если вас озадачивает конструкция вида 2>&1, тут все довольно просто. В Linux этими числами обозначаются дескрипторы файлов. 0 — стандартный ввод (по умолчанию, клавиатура), 1 стандартный вывод (по умолчанию, монитор) и 2 — стандартный вывод ошибок (по умолчанию, монитор). Весь вывод команды идет в файл с дескриптором 1, любые ошибки отправляются в файл с дескриптором 2. Если вы не хотите, чтобы сообщения об ошибках появлялись на экране, просто перенаправьте его в /dev/null. Но это не прекратит вывод на экран обычной информации. Например, если у вас нет разрешения на чтение домашнего каталога другого пользователя, вы не сможете просмотреть список его содержимого:

>$ ls /root

>ls: /root: Permission denied

>$ ls /root 2> /dev/null

>$

Как видите, во второй раз информация об ошибке не была напечатана. Все то же самое относится к другим программам и дескриптору 1. Если вы не хотите видеть нормальный выход из программы, то есть хотите, чтобы она работала молча, вы можете перенаправить в/dev/nullи его. Теперь, если вы не хотите видеть вообще никакого вывода программы — добавьте в нее следующее:

>$ ls /root > /dev/null 2>&1

Это означает, что программа будет отправлять свой вывод и ошибки, которые возникают в /dev/null, т. е. будет работать молча, что нам и нужно[17].

А что если вы хотите, чтобы ваш скрипт тоже возвращал какой-нибудь код завершения при выходе? Команда exit может принимать один аргумент — тот самый код завершения. Обычно число 0 используется для обозначения успешного завершения работы. Число, отличное от нуля означает, что произошла какая-то ошибка. Какое число возвращать — решает сам програмист. Посмотрим приведенный пример:

>#!/bin/bash

>if [ -f "/etc/passwd" ]; then

>echo «Файл passwd существует»

>exit 0

>else

>echo «Нет такого файла»

>exit 1

>fi

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

Переносимость ваших скриптов на bash

При написании ваших собственных скриптов важно делать это так, чтобы они оставались переносимыми. Термин «переносимость» означает, что если ваш скрипт работает под Linux, то он должен работать в другой Unix-системе с малыми изменениями или вообще без них. Чтобы добиться этого, вы должны быть осторожны при вызове внешних программ. Разработчик должен при этом ответить на вопрос: "Будет ли эта программа доступна на другом варианте Unix?"[18].

Допустим, вы используете программу foo, которая на Linux работает аналогично echo, поэтому вместо echo вы используете ее. Но если ваш скрипт будет работать на других системах, где нет программы foo, он начнет выдавать сообщения об ошибках. Кроме того, имейте в виду, что разные версии bash могут иметь разные методы для одних и тех же операций.

Например, конструкция VAR = $(ps) делает то же самое, что и VAR = `ps`, но на самом деле старые версии оболочек, например Bourne shell (sh), признают только последний синтаксис. Если вы собираетесь распространять свои скрипты, обязательно включайте текстовый файл README, который будет предупреждать пользователя о любых сюрпризах, в том числе и о том, что скрипт проверялся на такой-то версии bash. Желательно также указать, какие программы и библиотеки (и каких версий) будут нужны скрипту[19].

Заключение

Пришла пора завершить это краткое введение в написание скриптов на bash. Однако ваше обучение этому умению еще не завершено. В тоже время, написанного вполне достаточно, чтобы вы могли модифицировать имеющиеся скрипты и писать собственные.

Если вы действительно хотите стать мастером написания скриптов на bash, я рекомендую приобрести книгу «Learning the bash shell» (Изучение оболочки bash), 2-е издание издательства O’Reilly & Associates, Inc[20]. Скрипты на bash идеально подходят для повседневной работы по администрированию. Но если вы планируете что-то более серьезное, следует использовать гораздо более мощный язык, такой как C или Perl.


Рекомендуем почитать
Вокзал в передовом государстве

Жизнь лунатика становится нестерпимой, когда многие вспоминают про флаг, который некогда первый человек привёз на Луну. И Петька тут не поможет.


Соединители

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


Трава у дома

Орбитальные лифты, грузовые челноки и прииски Гелия-3. Трудные, смешные и грустные эпизоды в амбициозной и высокотехнологической гонке за будущим. Конкуренты НАСА и Китайского космического агентства. Интервью с современниками и очевидцами событий. Репортаж от первого лица. Воспоминания непосредственных участников.


Космолет

Как связан унылый, да еще подвальный офис на месте бывшего ресторана "Космос" с трансгалактическим лайнером? И почему замотавшийся и, честно говоря, довольно бесхребетный Начальник иногда ощущает себя Капитаном? Возможно, мы не все знаем не только о себе самих, но и о своей работе…


Звёздные Войны и Библия: Пустыни

Рассмотрение пустынь вселенной "Звёздные Войны" и связанных с ними сюжетов, в качестве отсылок к мотиву Библейских событий в Иудейской, Иорданской и Синайской пустынях.


Когда проснется Харон

Коммерческий транспорт "Олимп" выходит из прыжка в системе бозонной звезды. Людям предстоит колонизировать новую планету. Помочь в этом призван Харон, готовый принести себя в жертву и превратиться в одно из составляющих экзотической системы.