Можно использовать поток вывода всех имен команды tput, присваивая их переменным с более осмысленными наименованиями. При этом применяется следующий формат:
имя переменной='tput name'
21.2.2. Применение булевого потока вывода
Чтобы применить булев поток вывода для команды tput, воспользуйтесь конструкцией if:
STATUS_LINE=`tput hs` if $STATUS_LINE; then
echo "your terminal has a status line"
else
echo "your terminal has NO status line"
fi
21.2.3. Использование команды tput в сценариях
В приведенном сценарии командам tput bel и cl присваиваются более значимые имена.
$ pg tput1
#!/bin/sh
BELL=`tput bel`
CLEAR=`tput cl`
echo $BELL
echo $CLEAR
В следующем сценарии изменяются несколько видеоатрибутов и происходит отображение и сокрытие курсора:
$ pg tput2
#!/bin/sh
BOLD=`tput bold`
REV=`tput rev` NORMAL=`tput sgr0` CURSOR_OFF=`'tput civis` CURSOR_ON=`tput cnorm` tput init
# сокрытие курсора, выделение текста, перестановка текста, отображение курсора
echo $CURSOR_OFF
echo "${BQLD} WELCOME TO THE PIZZA PLACE ${NORMAL}"
echo -e "\n${REV} WE ARE OPEN 7 DAYS A WEEK ${NORMAL}"
echo $CURSOR_ON
21.2.4. Генерирование escape–последовательностей
Обратите внимание, что при использовании эмулятора довольно затруднительно скрыть курсор. Это обусловлено несколькими причинами:
1. Некоторые эмуляторы не воспринимают управляющий символ, скрывающий курсор. Желательно, чтобы разработчики программного обеспечения для эмуляторов учли это замечание. В исходный код потребуется внести изменения, реализующие сокрытие курсора.
2. Существует мнение, что некоторые более ранние версии команды tput civis не функционируют должным образом.
Управляющим символом, используемым для сокрытия курсора, является ?251
(буква l). Для возврата в исходное положение применяется символ ?25h.
Все управляющие символы выполняются с помощью escape–последовательности. Обычно за кодом клавиши [Esc] следует символ [. Затем управляющая последовательность подключает или отключает определенный атрибут терминала.
Для генерирования escape–последовательностей можно воспользоваться двумя различными методами. В таблице ниже приводятся оба метода, которые зависят от имеющейся системы. Третий метод можно применить независимо от того, используется система UNIX или Linux, поскольку управляющая последовательность реализована в составе конструкции echo. Именно третий метод и применяется в книге.
Чтобы переслать escape–последовательность и отключить курсор, используется следующий код:
Linux/BSD
echo -e "\033[?251"
System V
echo "\033[?251"
Обобщенный метод
echo "<CTRL‑VXESCAPE>[?2 51"
Клавише [Esc] соответствует код \033. Символ \ указывает команде echo, что далее следует восьмеричное значение. Например, для вывода на экран символа @ можно применить команду:
echo "@"
Или же для вывода на экран этого символа можно воспользоваться восьмеричным значением символа, которое равно 100.
echo -e "\100"
Для System V примените команду:
echo "\100"
Результат будет аналогичным.
Команда clear очищает экран и устанавливает курсор в верхнем левом углу экрана. Это положение курсора обычно называется home. При работе с терминалами, относящимися к семейству VT, эту процедуру выполняет последовательность esc [2J. Данную последовательность можно отправить с помощью конструкции echo.
System V echo "\033[2J"
LINUX/BSD echo -e "\033[2J"
При этом следует придерживаться тех же правил, которыми руководствуются при работе с управляющими символами, помещенными в текстовые файлы. Не следует применять методику "вырезать и вставить", поскольку в этом случае будет утеряно специальное значение символов. Чтобы вставить управляющие символы, отображающие курсор, воспользуйтесь следующим кодом:
echo '<CTRL‑V> hit the <ESCAPE> key then [?25h'
Здесь даны указания о том, что следует воспользоваться комбинацией клавиш [Ctrl+V], затем нажать клавишу [Esc] и после этого ввести символы [?25h.
Если при использовании команды tput civis курсор не исчезает и при этом не запущен эмулятор, воспользуйтесь следующим небольшим сценарием. С его помощью можно скрыть либо отобразить курсор. Вы можете подробно изучить приведенную
функцию либо перевернуть пару страниц и сразу ознакомиться с результатами выполнения сценария.
$ pg cursor
#!/bin/sh
#отображение|сокрытие курсора
#отображает или скрывает курсор при работе с терминалами vt100, 200, 220, meth220
#замечание: функционирует при нормальном ttу–соединении при использовании
#некоторых win–эмуляций
#проверьте TERM env для вашего типа!
_ОРТ=$1
if [ $# -ne 1 ]; then
echo "Usage: `basename $0` cursor [on | off]"
exit 1
fi
case "$_OPT" in
on|ON|On)
# отображение курсора
ON=`echo ^[[?25h`
echo $ON
;;
off|OFF|Off)
# сокрытие курсора
OFF=`'echo ^[ [?251`
echo $OFF
;;
*)echo "Usage: cursor on | off" exit 1
;;
esac
21.2.5. Изменение положения курсора
Команду tput также можно применять для отображения курсора в произвольном месте экрана. При этом используется следующий формат:
cup r c
где r — это номер ряда (строки) в нижней части экрана, а с — номер столбца на экране.
Лучше применять эту команду в форме функции, тогда можно указывать значения для строки и столбца.
xу()
(
#_R= row, _C=column
_R=$1
_C=$2
tput cup $_R $_C
}
clear
xy 1 5
echo -n "Enter your name :"
read NAME
xy 2 5
echo -n "Enter your age :"
read AGE
Конечно, желательно передавать строку для отображения; ниже приводится небольшая модификация этого сценария.
ху()
{
#_R= row, _C=column
_R-$1
_TEXT=$3
tput cup $_R $_C
echo -n $_TEXT
}
Сценарий можно вызвать следующим образом:
xy 5 10 "Enter your password :" read CODE
21.2.6. Центрирование отображаемого текста
При центрировании текста на экране нужно быть предельно внимательным. С помощью команды tput необходимо получить столбцы, затем получить значение для длины строки, исключить это значение из столбцов tput и разделить ответ на две части. В дальнейшем нужно только указать номер строки, где отобразится данная строка.
Ниже приводится часть кода, который выполняет эту задачу. Чтобы просмотреть строки файла и центрировать на экране весь текст, достаточно выполнить небольшое изменение.
Введите символы, нажмите клавишу [Return], и текст отобразится в середине экрана начиная со строки 10.
echo -n "input string :"
read STR
# быстрый способ вычисления длины строки
LEN=`echo $STR | wc -с`
COLS=`tput cols`
NEW_COL=`expr \($COLS - $LEN \) / 2`
xy 10 $NEW_COL
echo $STR
Чтобы указанная функция отличалась большей гибкостью, при ее вызове можно
использовать текст и номер строки. Функция будет иметь следующий вид:
centertxt() {
_ROW=$1 _STR=$2
# быстрый способ получения длины строки
LEN=`echo $_STR | wc -c`