<Предыдущая | Содержание: | Следующая>
Защитное программирование
При программировании важно проверять предположения. Это означает тщательную оценку статуса выхода программ и команд, используемых сценарием. Вот пример, основанный на реальных событиях. Несчастный системный администратор написал сценарий для выполнения задачи обслуживания на важном сервере. Сценарий содержал следующие две строки кода:
cd $ dir_name rm *
cd $ dir_name rm *
В этих двух строках нет ничего принципиально неправильного, если каталог, указанный в переменной, имя_каталога, существуют. Но что произойдет, если этого не произойдет? В этом случае cd команда не выполняется, и сценарий переходит к следующей строке и удаляет файлы в текущем рабочем каталоге. Совсем не желаемый результат! Из-за этого проектного решения незадачливый администратор разрушил важную часть сервера.
Давайте посмотрим, как можно улучшить этот дизайн. Во-первых, было бы разумно сделать выполнение rm зависит от успеха cd:
cd $ dir_name && rm *
cd $ dir_name && rm *
Таким образом, если cd команда не работает, rm команда не выполняется. Это лучше, но все же остается возможность того, что переменная, имя_каталога, не задано или пусто, что приведет к удалению файлов в домашнем каталоге пользователя. Этого также можно было избежать, проверив, что имя_каталога фактически содержит имя существующего каталога:
[[-d $ dir_name]] && cd $ dir_name && rm *
[[-d $ dir_name]] && cd $ dir_name && rm *
Часто лучше включить логику для завершения сценария и сообщения об ошибке, когда возникает ситуация, подобная описанной выше:
# Удалить файлы в каталоге $ dir_name if [[! -d "$ dir_name"]]; тогда
echo "Нет такого каталога: '$ dir_name'"> & 2 exit 1
fi
если ! cd $ dir_name; тогда
echo "Невозможно перейти к '$ dir_name'"> & 2 выйти 1
fi
если ! rm *; тогда
echo «Не удалось удалить файл. Проверить результаты»> & 2 выход 1
fi
# Удалить файлы в каталоге $ dir_name if [[! -d "$ dir_name"]]; тогда
echo "Нет такого каталога: '$ dir_name'"> & 2 exit 1
fi
если ! cd $ dir_name; тогда
echo "Невозможно перейти к '$ dir_name'"> & 2 выйти 1
fi
если ! rm *; тогда
echo «Не удалось удалить файл. Проверить результаты»> & 2 выход 1
fi
Здесь мы проверяем как имя, чтобы убедиться, что это имя существующего каталога, так и успешное
Логические ошибки
отстой cd команда. Если один из них не работает, описательное сообщение об ошибке отправляется в стандартную ошибку, и сценарий завершается со статусом выхода, равным единице, чтобы указать на сбой.