Чтение онлайн

на главную

Жанры

Основы программирования в Linux
Шрифт:

Рассмотрим упражнение 2.19.

Упражнение 2.19. Применение встроенных документов

Простейший пример просто передает входные данные команде

cat
.

#!/bin/sh

cat <<!FUNKY!

hello

this is a here

document

!FUNKY!

Этот пример выводит на экран следующие строки:

hello

this is a here

document

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

из сценария больших порций текста, как вы уже видели, и при этом позволяют избавиться от необходимости применять команду
echo
для каждой выводимой строки. Вы можете использовать восклицательные знаки (
!
) с двух сторон от идентификатора документа во избежание путаницы.

Если вы хотите обработать несколько строк заранее определенным способом, можно применить в сценарии строчный редактор ed и передать ему команды из встроенного документа (упражнение 2.20).

Упражнение 2.20. Ещё одно применение встроенного документа

1. Начнем с файла, названного a_text_file и содержащего следующие строки:

That is line 1

That is line 2

That is line 3That is line 4

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

#!/bin/sh

ed a_text_file <<!FunkyStuff!

3

d

., \$s/is/was/ w

q

!FunkyStuff!

exit 0

Если вы выполните этот сценарий, то увидите, что теперь файл содержит следующие строки:

That is line 1

That is line 2

That was line 4

Как это работает

Сценарий командной оболочки запускает редактор ed и передает ему команды, необходимые для перехода к третьей строке, удаления строки и затем замены ее содержимым текущей строки (поскольку строка 3 (line 3) была удалена, теперь текущая строка — последняя строка файла). Эти команды редактора ed берутся из строк сценария, формирующих встроенный документ, строк между маркерами

!Funky Stuff!
.

Примечание

Обратите внимание на знак

\
внутри встроенного документа, применяемый для защиты от подстановки, выполняемой командной оболочкой. Символ
\
экранирует знак
$
, поэтому оболочка знает, что не следует пытаться подставить вместо строки
\$s/is/was/
ее значение, которого у нее конечно же нет. Оболочка просто передает текст
\$
как $, который затем сможет интерпретировать редактор e

Отладка сценариев

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

Когда возникает ошибка, командная оболочка, как правило, выводит на экран номер строки, содержащей ошибку. Если ошибка сразу не видна, вы можете добавить несколько дополнительных команд

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

Поскольку сценарии обрабатываются интерпретатором, нет затрат на компиляцию при корректировке и повторном выполнении сценария. Основной способ отслеживания наиболее трудно выявляемых ошибок — задание различных опций командной оболочки. Для этого вы можете применять опции командной строки после запуска командной оболочки или использовать команду

set
. В табл. 2.19 перечислены эти опции.

Таблица 2.19

Опция командной строки Опция команды
set
Описание
sh -n <сценарий>
set -о noexec set -n
Только
проверяет синтаксические ошибки; не выполняет команды
sh -v <сценарий>
set -о verbose set -v
Выводит на экран команды перед их выполнением
sh -х <сценарий>
set -о xtrace set -x
Выводит на экран команды после обработки командной строки
sh -u <сценарий>
set -o nounset set -u
Выдает сообщение об ошибке при использовании неопределенной переменной

Вы можете установить опции с помощью флагов

– о
и сбросить их с помощью флагов
подобным же образом в сокращенных версиях. Получить простое отслеживание выполнения можно, используя опцию
xtrace
. Для начала вы можете применить опцию командной строки, но для более тщательной отладки следует поместить опции
xtrace
(задавая выполнение и сброс отслеживания выполнения) внутрь сценария, в тот фрагмент кода, который создает проблему. Отслеживание выполнения заставляет командную оболочку перед выполнением каждой строки сценария выводить на экран эту строку и подставлять в нее значения используемых переменных.

Для установки опции

xtrace
используйте следующую команду:

set -о xtrace

Для того чтобы снова отключить эту опцию, применяйте следующую команду:

set +о xtrace

Уровень выполняемых подстановок задается (по умолчанию) количеством знаков

+
в начале каждой строки. Вы можете заменить знак
+
на что-то более осмысленное, определив переменную командной оболочки
PS4
в вашем файле конфигурации оболочки.

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

EXIT
с помощью строки, подобной приведенной далее и помещенной в начале вашего сценария:

trap 'echo Exiting: critical variable = $critical_variable' EXIT

По направлению к графическому режиму — утилита dialog

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

Если вы знаете, что ваш сценарий придется выполнять только с консоли ОС Linux, существует довольно изящный способ оживить сценарий, применяя служебную команду

dialog
. Она использует средства псевдографики текстового режима и цвет, но при этом выглядит привлекательно.

Примечание

В некоторых дистрибутивах команда

dialog
по умолчанию не устанавливается; например, в Ubuntu вам, возможно, придется добавить совместно поддерживаемые репозитарии для поиска готовой версии. В других дистрибутивах вы можете найти уже установленный альтернативный вариант,
gdialog
. Он очень похож, но рассчитан на пользовательский интерфейс GNOME, применяемый для отображения диалоговых окон команды. В этом случае вы получите настоящий графический интерфейс. Как правило, в любой программе, использующей команду
dialog
, можно заменить все вызовы этой команды на
gdialog
, и вы получите графическую версию вашей программы. В конце этого раздела мы покажем пример программы, использующей команду
gdialog
.

Поделиться:
Популярные книги

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Измена. Вторая жена мужа

Караева Алсу
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Вторая жена мужа

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Пенсия для морского дьявола

Чиркунов Игорь
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Пенсия для морского дьявола

На изломе чувств

Юнина Наталья
Любовные романы:
современные любовные романы
6.83
рейтинг книги
На изломе чувств

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Сирота

Шмаков Алексей Семенович
1. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Сирота

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец

Огненный князь 4

Машуков Тимур
4. Багряный восход
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Огненный князь 4

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Инкарнатор

Прокофьев Роман Юрьевич
1. Стеллар
Фантастика:
боевая фантастика
рпг
7.30
рейтинг книги
Инкарнатор