Выбрать главу

Этот первый сценарий показывает, как проверить доступность указанной программы в списке путей 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, которая определяет местонахождение интерпретатора в момент запуска сценария.

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

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

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

Как это работает

Функция checkForCmdInPath отличает значение параметра с одним только именем программы (например, echo) от значения, содержащего полный путь, плюс имя файла (например, /bin/echo). Для этого она сравнивает первый символ в переданном ей значении с символом /; для чего ей требуется изолировать первый символ от остального значения параметра.