发现输出

    技术2024-05-31  87

    什么是tput?

    tput命令通过terminfo数据库初始化和操作您的终端会话。 使用tput ,您可以更改多种终端功能,例如移动或更改光标,更改文本属性以及清除终端屏幕的特定区域。

    什么是terminfo数据库?

    UNIX系统上的terminfo数据库定义了终端和打印机的属性和功能,包括相应设备(例如,终端和打印机)的行数和列数以及要发送到设备的文本的属性。 UNIX中几个常用的程序以及许多其他程序都依赖terminfo数据库来获得这些属性,包括vi和emacs编辑器以及curses和man程序。

    Tput命令行介绍

    与UNIX中的大多数命令一样, tput命令可以在您的shell命令行中或在shell脚本中使用。 为了更好地理解tput ,本文从命令行开始,然后继续介绍shell脚本示例。

    游标属性

    在UNIX shell脚本或命令行中,移动光标或更改其属性可能会有所帮助。 有时候,您可能需要输入敏感信息(例如密码)或在屏幕的两个不同区域中输入信息。 使用tput可以在这种情况下为您提供帮助。

    移动光标

    使用tput可以轻松移动光标在相应设备上的位置。 使用tput的cup选项或光标位置,可以将光标移动到设备行和列中的任何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)

    让我们分解subshel​​l命令:

    tput sc

    当前光标位置必须先保存。 要保存当前光标位置,请包含sc选项或“保存光标位置”。

    tput cup 23 45

    保存光标位置后,光标坐标将移至23,45。

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

    显示信息到标准输出。

    tput rc

    显示信息后,光标必须返回到用tput sc保存的原始位置。 要将光标返回到其最后保存的位置,请包括rc选项或“还原光标位置”。

    注意:由于本文首先详细介绍了tput命令行执行,因此,您可以在自己的子shell中执行命令,而不是分别执行每个命令并在执行每个命令之前显示提示,这样会更干净。

    更改游标的属性

    在向设备显示数据时,有时您不希望看到光标。 当数据在屏幕上滚动时,将光标变为不可见可创建更清晰的外观。 要使光标不可见,请使用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来获取窗口的大小,并反过来调用函数show菜单。

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

    结论

    在UNIX的shell脚本中引入tput可以增强脚本的外观。 在UNIX中有数百种方法来完成一项任务,那么为什么不为它添加一些颜色和专业外观呢? 学习tput很容易,并且对于脚本可能非常有效; 用户将更加欣赏控制屏幕外观的好处。 本文只是您使用tput可以做的事情的开始。 借助tput和一些工作,您可以创建功能强大的,菜单驱动的shell脚本,看起来很棒!


    翻译自: https://www.ibm.com/developerworks/aix/library/au-learningtput/index.html

    Processed: 0.034, SQL: 9