Искусство программирования на языке сценариев командной оболочки


Программирование на языке сценариев командной оболочки - стр. 263


  • запускаются, но работают не так как ожидалось (логические ошибки).

  • запускаются, делают то, что требуется, но имеют побочные эффекты (логическая бомба).

  • Инструменты, которые могут помочь при отладке неработающих сценариев

    1. команда echo, в критических точках сценария, поможет отследить состояние переменных и отобразить ход исполнения.

    2. команда-фильтр tee, которая поможет проверить процессы и потоки данных в критических местах.

    3. ключи -n -v -x

      sh -n scriptname

      -- проверит наличие синтаксических ошибок, не запуская сам сценарий. Того же эффекта можно добиться, вставив в сценарий команду set -n или set -o noexec. Обратите внимание, некоторые из синтаксических ошибок не могут быть выявлены таким способом.

      sh -v scriptname

      -- выводит каждую команду прежде, чем она будет выполнена. Того же эффекта можно добиться, вставив в сценарий команду set -v или set -o verbose.

      Ключи -n и -v могут употребляться совместно: sh -nv scriptname.

      sh -x scriptname

      -- выводит, в краткой форме, результат исполнения каждой команды. Того же эффекта можно добиться, вставив в сценарий команду set -x или set -o xtrace.

      Вставив в сценарий set -u или set -o nounset, вы будете получать сообщение об ошибке unbound variable всякий раз, когда будет производиться попытка обращения к необъявленной переменной.

    4. Функция "assert", предназначенная для проверки переменных или условий, в критических точках сценария. (Эта идея заимствована из языка программирования C.)

      Пример 29-4. Проверка условия с помощью функции "assert"

      #!/bin/bash # assert.sh

      assert () # Если условие ложно, { #+ выход из сценария с сообщением об ошибке. E_PARAM_ERR=98 E_ASSERT_FAILED=99

      if [ -z "$2" ] # Недостаточное количество входных параметров. then return $E_PARAM_ERR fi

      lineno=$2

      if [ ! $1 ] then echo "Утверждение ложно: \"$1\"" echo "Файл: \"$0\", строка: $lineno" exit $E_ASSERT_FAILED # else # return # и продолжить исполнение сценария.


      - Начало -  - Назад -  - Вперед -