<Попередній | зміст | Наступна>
Захисне програмування
Під час програмування важливо перевірити припущення. Це означає ретельну оцінку стану завершення програм і команд, які використовуються сценарієм. Ось приклад, заснований на реальній історії. Нещасний системний адміністратор написав сценарій для виконання завдання з обслуговування на важливому сервері. Сценарій містив такі два рядки коду:
CD $dir_name rm *
CD $dir_name rm *
У цих двох рядках немає нічого поганого, якщо каталог, названий у змінній, dir_name, існує. Але що станеться, якщо цього не станеться? У такому випадку, cd команда не вдається, і сценарій переходить до наступного рядка та видаляє файли в поточному робочому каталозі. Зовсім не бажаний результат! Нещасний адміністратор знищив важливу частину сервера через це дизайнерське рішення.
Давайте розглянемо деякі способи покращення цього дизайну. По-перше, може бути розумним зробити виконання rm залежно від успіху cd:
cd $dir_name && rm *
cd $dir_name && rm *
Таким чином, якщо cd команда не вдається, rm команда не виконується. Це краще, але все ще залишає відкритою можливість того, що змінна, dir_name, не встановлено або порожній, що призведе до видалення файлів у домашньому каталозі користувача. Цього також можна уникнути, перевіривши це dir_name насправді містить назву існуючого каталогу:
[[ -d $dir_name ]] && cd $dir_name && rm *
[[ -d $dir_name ]] && cd $dir_name && rm *
Часто краще включити логіку, щоб завершити сценарій і повідомити про помилку, коли виникає така ситуація, як наведена вище:
# Видалити файли в каталозі $dir_name, якщо [[ ! -d "$dir_name" ]]; тоді
echo "Немає такого каталогу: '$dir_name'" >&2 вихід 1
fi
якщо ! компакт-диск $dir_name; тоді
echo "Неможливо перейти до '$dir_name'" >&2 вихід 1
fi
якщо ! rm *; тоді
echo "Не вдалося видалити файл. Перевірити результати" >&2 вихід 1
fi
# Видалити файли в каталозі $dir_name, якщо [[ ! -d "$dir_name" ]]; тоді
echo "Немає такого каталогу: '$dir_name'" >&2 вихід 1
fi
якщо ! компакт-диск $dir_name; тоді
echo "Неможливо перейти до '$dir_name'" >&2 вихід 1
fi
якщо ! rm *; тоді
echo "Не вдалося видалити файл. Перевірити результати" >&2 вихід 1
fi
Тут ми перевіряємо як ім’я, щоб побачити, що воно є ім’ям існуючого каталогу, так і наступний
Логічні помилки
cess of the cd команда. Якщо будь-який з них не вдається, описове повідомлення про помилку надсилається до стандартної помилки, і сценарій завершується зі статусом виходу одиниця, що вказує на помилку.