Изучаем tput

Усовершенствуйте ваши shell-скрипты UNIX

Одним из мощных средств операционной системы UNIX® является возможность написания сценариев командной оболочки (shell-скриптов), которые существенно облегчают работу пользователей. Эти сценарии могут быть как простыми, состоящими из одной строки, так и очень сложными, содержащими тысячи строк. Иногда в shell-скриптах их авторы используют различные меню и хотят предоставить пользователям больше информации, нежели простая прокрутка текста. Также бывают случаи, когда пользователи видят одну или две строки, и автор хочет обратить внимание пользователей на какое-либо текстовое предупреждение. Независимо от сложности скрипта их авторам всегда нужны инструменты для того, чтобы выделить текст жирным шрифтом или подчеркиванием, изменить его фон и так далее. Как раз для этого и используется команда tput.

Адам Кормэни, администратор национального центра данных, Scientific Games Corporation

Являясь на сегодняшний день администратором национального центра данных, Адам Кормэни (Adam Cormany) в течение последних нескольких лет работал системным инженером UNIX, администратором UNIX и руководителем эксплуатации группы технического сопровождения корпорации Scientific Games. Адам более 10 лет вплотную занимался администрированием операционных систем AIX, Solaris и Red Hat Linux, и имеет статус сертифицированного специалиста IBM по eServer в области администрирования систем pSeries AIX. Помимо администрирования, Адам обладает глубокими знаниями в области написания shell-скриптов для командных оболочек BASH, CSH и KSH, а также умеет программировать на языках C, PHP и Perl.



17.06.2008

Что такое tput?

Команда tput инициализирует и управляет вашими сеансами работы с терминалом, используя базу данных terminfo. С помощью tput вы можете управлять различными функциями терминала, такими как перемещение или изменение вида курсора, изменение свойств текста и очистка определенных областей экрана терминала.


Что такое база данных terminfo?

База данных terminfo в системе UNIX задает атрибуты и переменные терминала и принтера, включая такие параметры, как количество строк и столбцов на соответствующем устройстве и атрибуты выводимого текста. Для определения этих и других атрибутов базу данных terminfo используют такие широко известные UNIX-программы, как текстовые редакторы vi и emacs, а также программы curses и man.


Введение в командную строку tput

Аналогично большинству команд UNIX, команда tput может вызываться как из командной строки, так и из shell-скрипта. Чтобы вы могли лучше понять команду tput, сначала в этом руководстве будет рассмотрена командная строка, а затем будут приведены примеры shell-скриптов.

Атрибуты курсора

Перемещение курсора или изменение его атрибутов может оказаться полезным в shell-скриптах или командной строке UNIX. Могут возникать моменты, когда вам требуется вводить закрытую информацию, такую как пароль, или вводить информацию в двух различных областях экрана. В этом вам может помочь tput.

Перемещение курсора

С помощью tput вы можете легко изменить позицию курсора на соответствующем устройстве. Используя опцию cup (позиция курсора – cursor position) команды tput, вы можете перемещать курсор в любую строку и столбец устройства с координатами X или Y. Координатами верхней левой точки устройства являются 0,0.

Чтобы переместить курсор в пятый столбец (координата X) первой строки (координата Y) устройства, просто выполните команду tput cup 5 1. Другим примером является команда tput cup 23 45, которая перемещает курсор в двадцать третий столбец сорок пятой строки.

Перемещение курсора и вывод информации

Другим полезным приемом является перемещение курсора, выполнение команды для вывода информации и последующее возвращение курсора в исходную позицию:

(tput sc ; tput cup 23 45 ; echo “Input from tput/echo at 23/45” ; tput rc)

Давайте рассмотрим команды подоболочки по отдельности:

tput sc

Сначала необходимо сохранить текущую позицию курсора. Для этого используйте опцию sc (сохранить текущую позицию – save cursor position).

tput cup 23 45

После сохранения исходной позиции курсор перемещается в точку с координатами 23,45.

echo “Input from tput/echo at 23/45”

Вывод информации в устройство стандартного вывода stdout.

tput rc

После того, как информация была отображена, курсор нужно вернуть в исходную позицию, которая была сохранена с помощью команды tput sc. Для этого используется опция rc (возврат курсора в исходную позицию – restore cursor position).

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

Изменение атрибутов курсора

Бывают ситуации, когда при отображении данных на устройстве вы не хотите видеть курсор. Если вы сделаете курсор невидимым, вы улучшите вид при прокрутке информации на экране. Чтобы сделать курсор невидимым, используйте опцию civis (например, tput civis). Когда вся информация будет полностью отображена, вы снова сможете сделать курсор видимым с помощью опции cnorm.

Атрибуты текста

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

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

  • 0: Черный
  • 1: Синий
  • 2: Зеленый
  • 3: Голубой
  • 4: Красный
  • 5: Пурпурный
  • 6: Желтый
  • 7: Белый

Выполнение следующих команд сделает цвет фона желтым, а цвет текста красным:

tput setb 6
tput setf 4

Чтобы реверсировать текущую цветовую схему, просто выполните команду tput rev.

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

Чтобы сделать текст жирным, используйте опцию bold. Используйте опцию smul, чтобы начать выделение текста подчеркиванием, и опцию rmul – чтобы закончить выделение.


Вывод ваших shell-скриптов на новый уровень

Теперь, когда вы знаете об основах запуска tput из командной строки, настало время сфокусироваться на применении полученных знаний для написания shell-скриптов, а также на использовании других возможностей. Для начала перечислим несколько функций, которые предоставляет в ваше распоряжение команда tput: это получение такой информации, как данные об устройстве, номер строки и столбца, а также очистка экрана.

Для определения количества столбцов, которые можно использовать на целевом устройстве (ширина), используется опция cols. Для определения количества строк (высота) используется опция lines .

В зависимости от желаемого результата вы можете удалить данные различными способами. Чтобы удалить данные с текущей позиции курсора до конца строки, используйте команду tput el. Чтобы удалить данные с текущей позиции курсора до конца экрана, используйте команду tput ed. Если вы хотите очистить весь экран (или область устройства), выполните команду tput clear.

Написание скрипта с использованием рассмотренных опций

Следующий код создает простое меню. Данный скрипт покажет вам, как можно использовать различные опции команды tput, о которых рассказывалось в этой статье.

 #!/bin/bash
trap 'get_window_size' WINCH                    # trap when a user has resized the window

_UNDERLINE_ON='tput smul'                       # turn on underline
_UNDERLINE_OFF='tput rmul'                      # turn off underline

get_window_size() {
  _WINDOW_X='tput lines'
  _WINDOW_Y='tput cols'

  _FULL_SPACES='echo ""|awk '
  {
    _SPACES = '${_WINDOW_Y}'
    while (_SPACES-- > 0) printf (" ")
  }''
  _FULL_UNDERLINE='echo "${_UNDERLINE_ON}${_FULL_SPACES}${_UNDERLINE_OFF}"'

  unset _FULL_SPACES
  show_menu

  return 0
}

set_color() {
  tput clear
  PS3="Enter Selection[1-9]:"
  select _COLOR in "Black" "Blue" "Green" "Cyan" "Red" "Magenta" "Yellow" "White" "Exit"
  do
    case ${REPLY} in
       [1-8])  _X='expr ${REPLY} - 1';;
           9)  break;;
           *)  echo "Invalid Color"; continue;;
    esac

    if [[ ${1} = "b" ]]
    then
      tput setb ${_X}
    else
      tput setf ${_X}
    fi
  done
}

show_menu() {
  while [[ -z ${_ANS} ]]
  do
    tput civis
    tput clear

        cat <<- EOF
                Window Size: ${_WINDOW_X} / ${_WINDOW_Y}

                Select => ${_UNDERLINE_ON}     ${_UNDERLINE_OFF}

                ${_FULL_UNDERLINE}
                B) Background Text Color
                F) Foreground Text Color

                X) Exit
        EOF

    tput rc
    tput smul
    tput cnorm

    read _ANS
    tput rmul

    case ${_ANS} in
      [Bb])  set_color "b";;
      [Ff])  set_color "f";;
      [Xx])  tput clear; exit;;
         *)
             echo -e "Invalid Selection: ${_ANS}\c"
             sleep 2
             ;;
    esac
    unset _ANS
  done
}

tput sgr0
tput civis
tput clear
tput cup 3 10
tput sc
tput cup 0 0

[[ -n ${_ANS} ]] && unset _ANS
get_window_size

exit 0

Давайте рассмотрим фрагменты этого shell-скрипта по отдельности.

Указываем, как должен интерпретироваться скрипт. В данном случае используется оболочка Bash. Далее устанавливаем ловушку для сигнала WINCH , а также назначаем функцию get_window_size, которая выступает в роли триггера для этого события. После этого определяем две переменные для упрощения последующего набора текста скрипта.

#!/bin/bash
trap 'get_window_size' WINCH                    # trap when a user has resized the window

_UNDERLINE_ON='tput smul'                       # turn on underline
_UNDERLINE_OFF='tput rmul'                      # turn off underline

Создаем функцию с именем get_widow_size, определяющую количество строк и столбцов. В дополнение к этому определяем переменную _FULL_UNDERLINE, содержащую подчеркивание шириной, равной ширине устройства (количеству столбцов).

get_window_size() {
  _WINDOW_X='tput lines'
  _WINDOW_Y='tput cols'

  _FULL_SPACES='echo ""|awk '
  {
    _SPACES = '${_WINDOW_Y}'
    while (_SPACES-- > 0) printf (" ")
  }''
  _FULL_UNDERLINE='echo "${_UNDERLINE_ON}${_FULL_SPACES}${_UNDERLINE_OFF}"'

  unset _FULL_SPACES
  show_menu

  return 0
}

Создаем функцию с именем set_color, позволяющую пользователям выбирать цвета фона и текста.

set_color() {
  tput clear
  PS3="Enter Selection[1-9]:"
  select _COLOR in "Black" "Blue" "Green" "Cyan" "Red" "Magenta" "Yellow" "White" "Exit"
  do
    case ${REPLY} in
       [1-8])  _X='expr ${REPLY} - 1';;
           9)  break;;
           *)  echo "Invalid Color"; continue;;
    esac

    if [[ ${1} = "b" ]]
    then
      tput setb ${_X}
    else
      tput setf ${_X}
    fi
  done
}

Создаем функцию с именем show_menu, определяющую размер устройства. Также в этой функции демонстрируется, как сделать невидимым курсор, очистить экран, напечатать текст и возвратить курсор в исходную позицию.

show_menu() {
  while [[ -z ${_ANS} ]]
  do
    tput civis
    tput clear

        cat <<- EOF
                Window Size: ${_WINDOW_X} / ${_WINDOW_Y}

                Select => ${_UNDERLINE_ON}     ${_UNDERLINE_OFF}

                ${_FULL_UNDERLINE}
                B) Background Text Color
                F) Foreground Text Color

                X) Exit
        EOF

    tput rc
    tput smul
    tput cnorm

    read _ANS
    tput rmul

    case ${_ANS} in
      [Bb])  set_color "b";;
      [Ff])  set_color "f";;
      [Xx])  tput clear; exit;;
         *)
             echo -e "Invalid Selection: ${_ANS}\c"
             sleep 2
             ;;
    esac
    unset _ANS
  done
}

Далее устанавливаем некоторые из атрибутов курсора. Сначала очищаем все атрибуты с помощью опции sgr0. Курсор становится невидимым, экран очищается. Затем невидимый курсор перемещается в точку с координатами 3,10, эта позиция сохраняется, после чего курсор перемещается в точку с координатами 0,0 (верхний левый угол экрана).

tput sgr0
tput civis
tput clear
tput cup 3 10
tput sc
tput cup 0 0

В завершении вызываем функцию get_window_size для получения размера окна и ответного вызова меню function show.

[[ -n ${_ANS} ]] && unset _ANS
get_window_size

exit 0

Заключение

Знакомство с командой tput позволит вам более широко взглянуть на написание shell-скриптов UNIX. В UNIX существуют сотни способов для выполнения поставленных задач, так почему бы не добавить немного цвета и не придать этому профессиональный вид? Изучить команду tput очень просто, и это может оказаться эффективным для написания скриптов; пользователи по достоинству оценят преимущества, получаемые от работы с грамотно оформленным экраном терминала. Эта статья – лишь начало того, что вы можете сделать с помощью tput. Затратив немного усилий, вы можете создать при помощи tput полноценный скрипт с использованием меню, которое будет выглядеть просто отлично!

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX, Linux
ArticleID=314629
ArticleTitle=Изучаем tput
publish-date=06172008