Бесплатный хостинг в Интернете для рабочих станций

<Предыдущая | Содержание: | Следующая>

Защитное программирование

При программировании важно проверять предположения. Это означает тщательную оценку статуса выхода программ и команд, используемых сценарием. Вот пример, основанный на реальных событиях. Несчастный системный администратор написал сценарий для выполнения задачи обслуживания на важном сервере. Сценарий содержал следующие две строки кода:


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 команда. Если один из них не работает, описательное сообщение об ошибке отправляется в стандартную ошибку, и сценарий завершается со статусом выхода, равным единице, чтобы указать на сбой.


Лучшие облачные вычисления для ОС в OnWorks: