Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - страница 10

стр.


ПРИМЕЧАНИЕ

Некоторые сценарии в этой книге используют дополнительные возможности bash, поддерживаемые не всеми POSIX-совместимыми командными оболочками.


Но хватит теории — приступим к знакомству со сценариями, которые будут включены в нашу библиотеку!

№ 1. Поиск программ в PATH

Сценарии, использующие переменные окружения (такие как MAILER или PAGER), таят в себе скрытую опасность: некоторые их настройки могут ссылаться на несуществующие программы. Для тех, кто не сталкивался прежде с этими переменными окружения, отметим, что MAILER должна хранить путь к программе электронной почты (например, /usr/bin/mailx), а PAGER должна ссылаться на программу постраничного просмотра длинных документов. Например, если вы решите увеличить гибкость сценария и вместо системной программы постраничного просмотра по умолчанию (обычно more или less) использовать для отображения вывода сценария переменную PAGER, необходимо убедиться, что эта переменная содержит действительный путь к существующей программе.

Этот первый сценарий показывает, как проверить доступность указанной программы в списке путей PATH. Он также послужит отличной демонстрацией нескольких приемов программирования на языке командной оболочки, включая определение функций и переменных. Листинг 1.1 показывает, как проверить допустимость путей к файлам.

Код

Листинг 1.1. Сценарий inpath с определениями функций

>#!/bin/bash

># inpath — Проверяет допустимость пути к указанной программе

># или ее доступность в каталогах из списка PATH

>in_path()

>{

>··# Получает команду и путь, пытается отыскать команду. Возвращает 0, если

>··#·· команда найдена и является выполняемым файлом; 1 — если нет. Обратите

>··#·· внимание, что эта функция временно изменяет переменную окружения

>··#·· IFS (Internal Field Separator — внутренний разделитель полей), но

>··#·· восстанавливает ее перед завершением.

>··cmd=$1········ourpath=$2···· result=1

>··oldIFS=$IFS·· IFS=":"

>··for directory in "$ourpath"

>··do

>····if [-x $directory/$cmd]; then

>······result=0······ # Если мы здесь, значит, команда найдена.

>····fi

>··done

>··IFS=$oldIFS

>··return $result

>}

>checkForCmdInPath()

>{

>··var=$1

>··if ["$var"!= ""]; then

>

····if ["${var:0:1}" = "/"]; then

>

······if [! -x $var]; then

>········return 1

>······fi

>

····elif! in_path $var "$PATH"; then

>······return 2

>····fi

>··fi

>}

В главе 0 мы рекомендовали создать в своем домашнем каталоге новую папку scripts и добавить полный путь к ней в свою переменную окружения PATH. Выполните команду echo $PATH, чтобы увидеть текущее значение переменной PATH, и добавьте в сценарий входа (.login, profile, bashrc или .bash_profile, в зависимости от оболочки) строку, изменяющую значение PATH. Подробности ищите в разделе «Настройка оболочки входа» в главе 0.


ПРИМЕЧАНИЕ

Если попробовать вывести список файлов в каталоге с помощью команды ls, некоторые специальные файлы, такие как .bashrc и .bash_profile, могут не отображаться. Это объясняется тем, что файлы, имена которых начинаются с точки, например .bashrc, считаются «скрытыми». (Как оказывается, эта «ошибка, превратившаяся в «фишку» была допущена еще в самом начале развития Unix.) Чтобы вывести все файлы, включая скрытые, добавьте в команду ls флаг −a.


Напомним еще раз: все наши сценарии написаны в предположении, что они будут выполняться командной оболочкой bash. Обратите внимание: этот сценарий явно указывает в первой строке (называется shebang), что для его интерпретации должен использоваться интерпретатор /bin/bash. Многие системы поддерживают также строку shebang /usr/bin/env bash, которая определяет местонахождение интерпретатора в момент запуска сценария.


ЗАМЕЧАНИЕ О КОММЕНТАРИЯХ

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

Поскольку вам придется читать сценарии других людей (не только наши!), будет полезно попрактиковаться понимать происходящее в сценариях по комментариям в них. Кроме того, писать комментарии — хорошая привычка, которую желательно выработать у себя при работе над собственными сценариями, потому что это поможет вам понять, чего вы стремитесь достигнуть в разных блоках кода.