Расширение возможностей Darwin

Как мы надеемся, материалы, изложенные в главе 18, помогут вам освоить основы работы с Darwin и приобрести навыки, минимально необходимые для изучения последуюших глав. В этой главе мы рассмотрим, каким образом можно расширить возможности Darwin, и, в частности, обсудим следующие важные темы:
Вводная информация о написании командных сценариев оболочки.
Обзорная информация о языках Perl, Python и Ruby, каждый из которых представляет собой гибкий и мощный язык командных сценариев, включенных в состав Leopard.
Поиск и установка дополнительных приложений с помощью MacPorts и Fink.
Компиляция приложений Darwin из исходного кода.
Вводная информация о командных сценариях оболочки.
Сценарии командного процессора играли важную роль в UNIX еще с момента появления первой оболочки. Командный сценарий или просто скрипт позволяет добавить в файл серию команд оболочки и, таким образом, обеспечить удобную возможность их повторного запуска. Пример командного сценария можно наблюдать в ходе процедуры запуска Leopard. Во время запуска системы исполняется скрипт /etc/rc, этот файл инициирует последовательность процессов, которые запускают, конфигурируют и поддерживают операционную систему и ее сетевые функции.
Примечание
Редактировать этот файл /etc/rc не рекомендуется, поскольку в случае ошибки ваша система не сможет загрузиться. Однако, просмотрев этот скрипт, вы увидите, что в самом его конце выполняется проверка существования файла /etc/rc.local. Если этот файл существует, то все содержащиеся в нем команды будут выполнены. Если вы хотите включить собственные скрипты, которые исполнялись бы при каждой загрузке ОС, вам следует создать этот файл. Затем добавьте в состав этого файла все дополнительные скрипты, которые вы хотите исполнять при каждой загрузке системы.
Написание командного сценария может быть очень простой задачей —фактически, ничуть не более сложной, чем ввод последовательности команд, исполняемых из командной строки. Однако командные сценарии могут принимать внешние переменные, а также могут содержать простые логические конструкции if... then и циклы. Все эти темы будут подробно рассмотрены далее в этой главе, а пока рассмотрим простой командный сценарий, приведенный в листинге 19.1.
Листинг. Пример простого командного сценария
1: !/bin/sh 2:
3: togglevis
4: A shell script to toggle the visibility of hidden files in the Finder 5:
6: set ps acx I grep Finder 7:
8: show="defaults read com.apple.finder AppleShowAllFiles 9:
10: if [ $show - eq 1 J; then
11: defaults write com.apple.finder AppleShowAllFiles 0 12: kill $1 13: else
14: defaults write com.apple.finder AppleShowAllFiles 1 15: kill $1 16: fi
Примечание
Специально для тех, кто ненавидит номера строк в программах, мешающие копированию кода из электронных книг и его последующему исполнению, далее в этой главе будет приведен скрипт на Perl, который при небольшой модификации позволит удалять номера строк автоматически.
Скрипт, приведенный в листинге 19.1, позволяет переключать режим видимости скрытых элементов в Mac OS X Finder. Это осуществляется путем установки скрытого параметра Finder AppleShowAllFiles в 1 или в 0 и немедленным перезапуском Finder, после которого внесенное изменение входит в силу.
Примечание
По правде говоря, скрипт, не осуществляет перезапуска Finder. На самом деле этот скрипт просто останавливает процесс Finder. Mac OS X, которая зависит от приложения Finder, обнаруживает это и выполняет перезапуск приложения Finder.
Первая строка рассматриваемого сценария, !/bin/sh, часто называемая строкой интерпретатора, имеет особое значение для всех скриптов, поскольку она указывает оболочке на интерпретатор исполняемого скрипта.
Примечание
В Mac OS X Leopard, /bin/sh и /bin/bash представляют собой исполняемые файлы оболочки Bash. Большинство скриптов в UNIX вообще, и в Mac OS X в частности, написаны для оболочки Bourne. Это сделано с целью обеспечения совместимости между различными платформами UNIX, так как практически все они имеют установленную оболочку Bourne. Оболочка Bash обеспечивает полную обратную совместимость с оболочкой Bourne и добавляет несколько дополнительных функций, позаимствованных из оболочек С и Когп. В целом, синтаксис командных сценариев, рассматриваемый в данной главе, представляет собой синтаксис Bourne. Однако некоторые из команд, приведенных в обсуждаемых скриптах, могут быть специфичными для Mac OS X.
Строки 3 и 4, как и все строки, начинающиеся с символа, представляют собой комментарии. Они включены в скрипт с тем, чтобы повысить его удобочитаемость и информировать пользователей о том, какие задачи выполняет конкретный скрипт. Комментарии как таковые не влияют на исполнение скрипта, и в этом отношении они не являются его обязательными элементами. Использование комментариев - это просто хорошая привычка, поскольку они будут полезны не только тем, кто будет просматривать ваш скрипт в дальнейшем, но и для вас самих, когда вы вернетесь к этому скрипту через несколько недель, месяцев или даже лет. Первая строка комментария сообщает имя скрипта, а вторая - описывает, что именно он делает.
Строка 6 демонстрирует, во-первых, использование команды set и, во-вторых, применение обратных кавычек в скриптах. В командных сценариях все, что заключено между обратными кавычками, исполняется, а результат передается скрипту. В данном случае мы имеем дело с так называемой заменой команд. Команда set устанавливает аргументы, использованные в скрипте, в точности так, как если бы они были введены из командной строки. Таким образом, строка 6 принимает результаты команды ps асх grep Finder и делает их нашими аргументами. Значение строки 6 для всех остальных команд скрипта заключается в том, что она назначает PID процесса Finder первым аргументом, доступ к которому можно получить через переменную $1.
Строка 8 устанавливает переменную show на результат команды defaults read com. apple, finder AppleShowAllFiles. Переменная defaults дает возможность получить доступ из командной строки к параметрам предпочтительных настроек Mac OS X и изменить их. В данном случае мы используем ее с тем, чтобы прочесть параметр AppleShowAllFiles, хранящийся в com.apple, finder, и определить его текущее значение с тем, чтобы переключить его. Если параметра AppleShowAllFiles в вашем файле параметров предпочтительной настройки Finder еще не существует, вы получите сообщение об ошибке, выглядящее примерно так, как показано в листинге 19.2.
Листинг 19.2. Сообщение об ошибке, выводимое скриптом из листинга 19.1 в том случае, если параметра AppleShowAllFiles не существует 2007-06-26 12:24:00.175 defaults
The domain/default pair of does not exist togglevis.sh: line 10: [: ==: unary operator expected
В данном случае это сообщение можно игнорировать, поскольку скрипт продолжит исполнение и создаст отсутствующий параметр. Однако если вы продолжите получать сообщения об ошибках и после этого, вам следует более внимательно изучить скрипт, поскольку причина такой ошибки коренится в чем-то другом.
Строки с 10 по 16 представляют собой условную конструкцию if.,.then...else и обеспечивают выполнение ожидаемых действий на основании указанного условия. Во-первых, в строке 10 мы выполняем проверку переменной show на равенство 1. Если это условие соблюдено, осуществляется переход к строке 11, где МЫ изменяем значение com.apple, finder AppleShowAllFiles С 1 на 0. Затем в строке 12 мы останавливаем процесс Finder, используя переменную $1, значение которой было установлено в строке 6. Если условие, заданное в строке 10, ложно, то осуществляется переход к строке 14, где значение com.apple, finder AppleShowAllFiles устанавливается на 1, после чего процесс Finder останавливается. Строка 16 завершает конструкцию if...then... else оператором fi.
Исполнение скрипта завершается после того, как заканчиваются все операции.
Существует несколько способов запуска этого скрипта. Первый из них заключается в его передаче исполняемому модулю оболочки в качестве аргумента. Второй состоит в создании фактического исполняемого скрипта.
Листинг. Передача скрипта в качестве аргумента исполняемому модулю оболочки
leopard:-/bin scott$ sh togglevis
Если вы хотите иметь возможность быстрого доступа к скрипту из любого местоположения, вам следует сначала сделать его исполняемым файлом и убедиться в том, что каталог, в котором он хранится, включен в вашу переменную SPATH.
Листинг. Вывод на экран переменной $РАТН leopard:-/bin scott$ echo $PATH
/opt/local/bin:/Users/scott/bin:/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin
Чтобы сделать файл скрипта исполняемым, следует применить команду chmod.
Листинг. Преобразование скрипта в исполняемую форму leopard:-/bin scottS chmod u+x togglevis
Теперь, притом условии, что каталог, в котором находится ваш скрипт, указан в переменной SPATH, вы сможете запускать из командной строки команду togglevis точно так же, как делаете это по отношению к любой другой команде.