Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

Захисне програмування

Під час програмування важливо перевірити припущення. Це означає ретельну оцінку стану завершення програм і команд, які використовуються сценарієм. Ось приклад, заснований на реальній історії. Нещасний системний адміністратор написав сценарій для виконання завдання з обслуговування на важливому сервері. Сценарій містив такі два рядки коду:


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


Найпопулярніші хмарні обчислення ОС на OnWorks: