№ 22. Утилита для напоминания
В распоряжении пользователей Windows и Mac уже много лет имеются превосходные и простые утилиты, такие как Stickies, позволяющие сохранять короткие заметки и выводить напоминания на экран. Они прекрасно подходят для быстрой записи телефонных номеров или другой информации. К сожалению, в командной строке Unix нет аналогичной программы для создания заметок, но эту проблему легко решить парой сценариев.
Первый сценарий, remember (приводится в листинге 3.1), позволяет сохранить заметку в общем файле rememberfile в домашнем каталоге. Если вызвать этот сценарий без аргументов, он будет читать стандартный ввод, пока не встретит символ конца файла ( ^D), который вводится комбинацией ctrl-D. Если вызвать сценарий с аргументами, он запишет их прямо в файл с данными.
Вторая половина описываемой двоицы −remindme, сопутствующий сценарий, представленный в листинге 3.2, который либо выводит все содержимое файла rememberfile, когда запускается без аргументов, либо отображает результаты поиска, используя аргументы как шаблон.
Листинг 3.1.Сценарий remember
··#!/bin/bash
··# remember — простой блокнот для записи заметок из командной строки
··rememberfile="$HOME/.remember"
··if [$# −eq 0]; then
····# Предложить пользователю ввести заметку и добавить ее в конец
····#·· файла rememberfile.
····echo "Enter note, end with ^D: "
····cat — >> $rememberfile
··else
····# Записать в конец файла. remember все полученные аргументы.
····echo "$@" >> $rememberfile
··fi
··exit 0
В листинге 3.2 приводится сопутствующий сценарий remindme.
Листинг 3.2.Сценарий remindme, сопутствующий сценарию remember из листинга 3.1
#!/bin/bash
# remindme — ищет в файле с данными совпадения с заданным шаблоном или, если
#·· запускается без аргументов, выводит все содержимое файла
rememberfile="$HOME/.remember"
if [! -f $rememberfile]; then
··echo "$0: You don't seem to have a.remember file. " >&2
··echo "To remedy this, please use 'remember' to add reminders" >&2
··exit 1
fi
if [$# −eq 0]; then
··# Вывести все содержимое rememberfile, если критерии поиска не заданы.
··more $rememberfile
else
··# Иначе выполнить поиск в файле по заданному критерию и вывести
··#·· результаты.
··grep −i — "$@" $rememberfile | ${PAGER:-more}
fi
exit 0
Сценарий remember в листинге 3.1 может действовать как интерактивная программа, предлагающая пользователю ввести текст заметки для запоминания, или как команда, сохраняющая свои аргументы командной строки. На случай, если пользователь запустит сценарий без аргументов, мы предусмотрели одну хитрость. После вывода сообщения с предложением ввести заметку, мы вызываем команду cat, чтобы прочитать ввод пользователя
:
cat — >> $rememberfile
В предыдущих главах нам доводилось использовать команду read, чтобы получить ввод пользователя. Здесь же команда cat читает текст из stdin (дефис — в команде является коротким обозначением stdin или stdout, в зависимости от контекста), пока пользователь не нажмет комбинацию ctrl-D, которая сообщит утилите cat о завершении файла. После этого cat выведет текст, прочитанный из stdin, и добавит его в конец файла rememberfile.
Однако, если сценарий запустить с аргументами, он просто добавит их все в конец rememberfile
.
Сценарий remindme в листинге 3.2 не может работать в отсутствие файла rememberfile, поэтому в самом начале, перед попыткой что-либо сделать, он проверяет его наличие. Если файл отсутствует, сценарий завершается с выводом сообщения о причине остановки.
Если сценарий запущен без аргументов, предполагается, что пользователь просто захотел увидеть содержимое rememberfile. Использование утилиты more позволяет организовать постраничный просмотр файла rememberfile
.
Если сценарий запущен с аргументами, вызывается утилита grep, чтобы найти совпадения с указанным шаблоном в rememberfile без учета регистра символов, а затем результаты выводятся с помощью утилиты постраничного просмотра
.
Читать дальше