Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
Руководство по Bash для начинающих
Назад Глава 2: Пишем и отлаживаем скрипты Вперед

Отладка скриптов Bash

Отладка сразу всего скрипта

Когда дела идут не так, как планировалось, необходимо определить, из-за чего в скрипте возникли проблемы. В Bash для отладки предоставляются широкие возможности. Наиболее распространенным способом является запуск подоболочки с параметром -x, благодаря которому весь скрипт будет запущен в отладочном режиме. После того, как для каждой команды будут выполнены все необходимые подстановки и замены, но перед тем, как команда будет выполнена, в стандартный выходной поток будет выдана трассировка команды и все ее аргументы.

В результате скрипт commented-script1.sh будет запущен в отладочном режиме. Отметим еще раз, что добавленные комментарии не будут отображаться в выводе скрипта.

willy:~/scripts> bash -x script1.sh
+ clear

+ echo 'The script starts now.'
The script starts now.
+ echo 'Hi, willy!'
Hi, willy!
+ echo

+ echo 'I will now fetch you a list of connected users:'
I will now fetch you a list of connected users:
+ echo

+ w
  4:50pm  up 18 days,  6:49,  4 users,  load average: 0.58, 0.62, 0.40

USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     tty2     -                Sat 2pm  5:36m  0.24s  0.05s  -bash
willy    :0       -                Sat 2pm   ?     0.00s   ?     -
willy    pts/3    -                Sat 2pm 43:13  36.82s 36.82s  BitchX willy ir
willy    pts/2    -                Sat 2pm 43:13   0.13s  0.06s  /usr/bin/screen
+ echo

+ echo 'I'\''m setting two variables now.'
I'm setting two variables now.
+ COLOUR=black
+ VALUE=9
+ echo 'This is a string: '
This is a string:
+ echo 'And this is a number: '
And this is a number:
+ echo

+ echo 'I'\''m giving you back your prompt now.'
I'm giving you back your prompt now.
+ echo

В настоящее время есть полноценный отладчик для Bash, который доступен на SourceForge. Подобные отладочные средства есть в большинстве современных версий Bash, начиная с версий 3.x.

Отладка скрипта по частям

С помощью встроенной команды set, имеющейся в Bash, вы можете запускать в обычном режиме те части скрипта, относительно которых вы уверены, что они работают без ошибок, и отображать отладочную информацию только там, где есть подозрение на неправильную работу. Скажем, мы не уверены, что в примере commented-script1.sh будет делать команда w, поэтому мы можем окружить эту команду следующими отладочными командами:

set -x                  # activate debugging from here
w
set +x                  # stop debugging from here

Выдаваемая информация будет выглядеть следующим образом:

willy: ~/scripts> script1.sh
The script starts now.
Hi, willy!

I will now fetch you a list of connected users:

+ w
  5:00pm  up 18 days,  7:00,  4 users,  load average: 0.79, 0.39, 0.33
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU  WHAT
root     tty2     -                Sat 2pm  5:47m  0.24s  0.05s  -bash
willy    :0       -                Sat 2pm   ?     0.00s   ?     -
willy    pts/3    -                Sat 2pm 54:02  36.88s 36.88s  BitchX willyke
willy    pts/2    -                Sat 2pm 54:02   0.13s  0.06s  /usr/bin/screen
+ set +x

I'm setting two variables now.
This is a string:
And this is a number:

I'm giving you back your prompt now.

willy: ~/scripts>

В одном и том же скрипте вы можете включать и выключать отладочный режим столько раз, сколько это необходимо.

В таблице ниже приводится обзор других полезных параметров Bash:

Таблица 2.1. Обзор отладочных параметров

Краткая нотацияПолная нотацияРезультат

set -f

set -o noglob

Отключается генерация имени файла с помощью метасимволов (подстановка).

set -v

set -o verbose

Командная оболочка печатает входные строки сразу, как они считываются.

set -x

set -o xtrace

Перед исполнением команды выдаются трассировочные данные.

Символ "тире" используется для активации параметра командной оболочки, а символ "плюс" - для его деактивации. Не перепутайте это!

В приведенном ниже примере мы продемонстрируем, как эти параметры используются в командной строке:

willy:~/scripts> set -v

willy:~/scripts> ls
ls 
commented-scripts.sh    script1.sh

willy:~/scripts> set +v
set +v

willy:~/scripts> ls *
commented-scripts.sh    script1.sh

willy:~/scripts> set -f

willy:~/scripts> ls *
ls: *: No such file or directory

willy:~/scripts> touch *

willy:~/scripts> ls
*   commented-scripts.sh    script1.sh

willy:~/scripts> rm *

willy:~/scripts> ls
commented-scripts.sh    script1.sh

Кроме того, эти режимы можно указать в самом скрипте, для этого добавьте соответствующие параметры в первую строку, в которой указывается командная оболочка. Параметры можно объединить, что является обычным приемом при использовании команд UNIX:

#!/bin/bash -xv 

Как только вы обнаружили ошибочный фрагмент в вашем скрипте, вы можете добавить инструкции echo перед каждой командой, в работе которой вы не уверены, и можете увидеть, где именно и почему что-то не работает. В примере скрипта commented-script1.sh, если считать, что проблемы возникают при отображении пользователей, это можно сделать, например, следующим образом:

echo "debug message: now attempting to start w command"; w

В более сложных скриптах инструкцию echo можно добавлять для отображения значений переменных на различных этапах работы скрипта, что может помочь в обнаружении проблемы:

echo "Variable VARNAME is now set to $VARNAME."

Предыдущий раздел: Оглавление Следующий раздел:
Основы скриптов   Подводим итог



Средняя оценка 5 при 1 голосовавших