tput

您还未登录!|登录|注册|帮助
CSDN首页
资讯
论坛
博客
下载
搜索
更多
萝卜 白菜
Linux sky
登录
注册
博客首页



空间
博客
好友
相册
留言
用户操作
[留言] [发消息] [加为好友]
songguozhiID:songguozhi

共22079次访问,排名9392
songguozhi的文章
原创 91 篇
翻译 1 篇
转载 49 篇
评论 33 篇
订阅我的博客




songguozhi的公告
文章分类
C/C++ 程序
C/C++ 库函数
Java
Linux/Unix
Others
powerdesigner
VC++
VC++ 多线程
汇编
其他
嵌入式
数据库(SQL Server)
网络安全
存档
2011年05月(15)
2011年02月(1)
2011年01月(1)
2010年12月(3)
2010年11月(3)
2010年10月(3)
2010年09月(14)
2010年08月(11)
2010年07月(2)
2010年06月(7)
2010年05月(4)
2010年04月(3)
2010年03月(2)
2010年02月(1)
2010年01月(11)
2009年12月(1)
2009年07月(1)
2009年03月(3)
2009年01月(4)
2008年12月(9)
2008年11月(12)
2008年10月(27)
2008年09月(3)
公告:
本周末CSDN博客暂时停止服务
[意见反馈][官方博客]
tput使用 收藏

Adam Cormany (acormany@yahoo.com), 国家数据中心经理, Scientific Games Corporation

2008 年 6 月 12 日
UNIX® 所拥有的最强大的功能之一是能够创建 shell 脚本,让用户的生活更轻松。这些脚本涉及的范围非常广泛,从简单的单行程序一直到包括数千行代码的程序。许多情况下,shell 脚本将发展为基于菜单的脚本,脚本编写者希望向用户显示除滚动文本之外的更多内容。有时候,shell 脚本编写者只希望向用户显示输出中的一行或两行,提醒用户重点关注警告消息。抛开复杂性不谈,脚本编写者往往需要能通过一种方法将输出更改为粗体,为其加下划线,实现反向突出显示等。而这正是 tput 的用武之地。

什么是 tput?

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



回页首





什么是 terminfo 数据库?

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


回页首





tput 命令行简介

与 UNIX 中的大多数命令一样,tput 命令既可以用在 shell 命令行中也可以用在 shell 脚本中。为让您更好地理解 tput,本文首先从命令行讲起,然后紧接着讲述 shell 脚本示例。



tput命令将通过 terminfo 数据库对您的终端会话进行初始化和操作。通过使用tput您可以更改几项终端功能,如移动或更改光标、更改文本属性,以及清除终端屏幕的特定区域。我们先看看它的常用参数:

(1)字符串输出参数设置
  bel 警铃
  blink 闪烁模式
  bold 粗体
  civis 隐藏光标
  clear 清屏
  cnorm 不隐藏光标
  cup 移动光标到屏幕位置(x,y)
  el 清除到行尾
  ell 清除到行首
  smso 启动突出模式
  rmso 停止突出模式
  smul 开始下划线模式
  rmul 结束下划线模式
  sc 保存当前光标位置
  rc 恢复光标到最后保存位置
  sgr0 正常屏幕
  rev 逆转视图
(2)数字输出参数设置
  cols 列数目
  ittab 设置宽度
  lines 屏幕行数
(3)布尔输出参数设置
  chts 光标不可见
  hs 具有状态行

光标属性

在 UNIX shell 脚本中或在命令行中,移动光标或更改光标属性可能是非常有用的。有些情况下,您可能需要输入敏感信息(如密码),或在屏幕上两个不同的区域输入信息。在此类情况下,使用 tput 可能会对您有所帮助。

移动光标

使用 tput 可以方便地实现在各设备上移动光标的位置。通过在 tput 中使用 cup 选项,或光标位置,您可以在设备的各行和各列中将光标移动到任意 X 或 Y 坐标。设备左上角的坐标为 (0,0)。

要在设备上将光标移动到第 5 列 (X) 的第 1 行 (Y),只需执行 tput cup 5 1。另一个示例是 tput cup 23 45,此命令将使光标移动到第 23 列上的第 45 行。

移动光标并显示信息

另一种有用的光标定位技巧是移动光标,执行用于显示信息的命令,然后返回到前一光标位置: (tput sc ; tput cup 23 45 ; echo “Input from tput/echo at 23/45” ; tput rc)



下面我们分析一下 subshell 命令: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,因此您可能会觉得在自己的 subshell 中执行命令要比单独执行每条命令然后在每条命令执行之前显示提示更简洁。

更改光标的属性

在向某一设备显示数据时,很多时候您并不希望看到光标。将光标转换为不可见可以使数据滚动时的屏幕看起来更整洁。要使光标不可见,请使用 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 脚本。

设置解释脚本的方式。在本例中,要使用的 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 引入 UNIX 中的 shell 脚本可以改善脚本的外观。在 UNIX 中可以通过数百种方法来完成一项任务,为何不为您的方法增加一些色彩和个性化因素呢?学习 tput 非常容易,并且可能对脚本是非常有效的;用户将从更多地控制屏幕的外观方面获益。关于您可以使用 tput 做些什么,本文仅起到了抛砖引玉的作用。通过 tput 和极少的工作量,您就可以创建看起来非常漂亮而全面的菜单驱动的 shell 脚本!



参考资料
学习
您可以参阅本文在 developerWorks 全球站点上的 英文原文 。

Colours and Cursor Movement with tput:阅读 Bash 提示符 tput 的操作方法。

GNU tput 命令:阅读有关 GNU 命令的信息。

AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。

AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。

AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为你把本专区的所有专题进行汇总,让您更方便的找到你需要的内容。

developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。

Podcast:收听 Podcast 并与 IBM 技术专家保持同步。


获得产品和技术
IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。


讨论
参与“AIX and UNIX”论坛:
AIX 5L——技术论坛
AIX for Developers 论坛
集群系统管理
IBM Support Assistant
性能工具——技术
虚拟化——技术
更多“AIX and UNIX”论坛




关于作者


Adam Cormany 目前是国家数据中心经理,在最近几年中,他在任此职的同时还一直担任 Scientific Games 的 UNIX 系统工程师、UNIX 管理员和运营经理。Adam 潜心从事 AIX 以及 Solaris 和 Red Hat Linux 管理已有 10 多年。他是一位 pSeries AIX 系统管理方面的 IBM eServer 认证专家。除管理外,Adam 还在 BASH、CSH 和 KSH 的 Shell 脚本编写以及 C、PHP 和 Perl 编程方面具有渊博的知识。


发表于 @ 2008年10月30日 15:26:00 | 评论( 0 ) | 举报| 收藏
旧一篇:vim 使用技巧 | 新一篇:Snort 中文手册

查看最新精华文章 请访问博客首页相关文章
lINUX SHELL --- A Smart Library
创建屏幕输出:tput
GNU 和 UNIX 命令
shell编程 一
终端乱码的解决
BASH Shell change the color of my shell prompt under Linux or UNIX
脚本里的颜色设置
删除当前所在目录下的所有文件夹的脚本
发表评论
表 情:
评论内容:
用 户 名:
登录 注册
匿名用户


专区推荐内容
下载Windows Phone 中文培训包
下载 Windows Phone 开发工具
得奖?简单的超乎你想象!
UMPC和 MID的开发难题及解决之道
针对游戏的线程基本信息
评国内开发操作系统走向何方
手慢的你伤不起!第一阶段获奖名单公布
MeeGo,Android,iOS对比
MeeGo 1.2 版本带来的思考
【周周有礼】获奖其实很简单,不信来试试!
企业信息化也会亚健康,1分钟调研拿iPad2
Qt 4.7.3编译MYsql驱动
羡慕嫉妒恨!MeeGO平板到手
MeeGo SDK 1.2 for Linux 初窥
关于QT编程入门的那些事
相见 ——“人生若只如初见”
游戏远程代码注入和动态连接库的使用
哥是传奇—组团参赛心得
【教程】Windows平台下MeeGo v1.2 SDK的安装
MeeGo 1.2 正式版发布
在生命走到尽头前用脚贡献了最后一个代码补丁
浅谈QT中窗口刷新事件
赢笔记本电脑,提升管理软件新水平!
【教程】安装MeeGO和Windows 7双系统的方法
分享我的个人初赛体会
Nokia宣布Qt 5计划
立即加入IBM dW,万千技术尽网罗
Linux 上简单的MeeGo 开发 QT 程序
软件产品性能优化注意事项
用C#实现HTTP协议下的多线程文件传输
【实战】搭建Meego Tablet开发测试平台
AppUp Center为更多程序员创造机会
【源码分享】一个多线程下载文件的程序
轻松漫画聊快速构建网站
如何创建一个简单的Qt应用程序
【赢取旧金山之旅】2011线程挑战赛
【图】爱上NOOK COLOR的5个理由
IPAD&NOOK COLOR屏幕对比多图
【教程】AppUp 进阶基础篇
Nokia CEO:下一步会与谁合作?
点评三星Smart TV智能电视
太震撼了!首次参加IDF有感
【教程】基于VC色温图效果实现
【教程】游戏技巧特效处理
Firefox 4在meego上成功安装
IDF2011:多图详解MeeGo 3月后正式发布
PayPal助力移动支付应用
Android应用换电视,前30名有效!
【教程】笔记本安装MeeGo
微软BI解决方案开发简介
<<
>>
热门招聘职位 【更多】
加盟跨国开发团队: 爱立信上海急聘多媒体软件开发和测试干将!
东软(天津)、展讯(天津)高薪诚聘程序员(天津空港经济区)
诚聘Android/java工程师,运维,架构师
职场良机:预约5年后中国深具影响力网游研发公司——红石娱动的一席之位
加拿大思拓软件公司诚聘C++、C#开发工程师
网票网急聘.net软件开发工程师,待遇从优
【上海瑞创网络】诚聘互联网技术人才!招(PHP、测试、运维) 经理!
【天元网络】诚聘JAVA、.NET、项目经理、维护工程师
【友友系统】云的架构师 邀您一起驾驭云端能量
【广州菲音】高薪诚聘C++游戏服务器端开发工程师等各类游戏开发人才
知名社交手游公司DeNA China 10K-30K高薪诚聘开发类人才
【盛旋软件】诚聘英才之图形图像、网站开发、游戏开发工程师!
【傲盾软件】高薪诚聘C、C++、JAVA、cavium/linux工程师
【道达天际】高薪诚聘:渗透测试、网络安全、逆向技术分析 专业人才
诚聘高级软件工程师,架构师,待遇从优
【山重融资】诚聘软件开发工程师、网络管理工程师
【卓坤信息】诚聘MFC高级客户端、网页设计师、PHP开发等
爱福康诚招:C++ / Directshow 软件工程师
【天健集团】诚聘架构师,高级软件开发工程师(.NET、PB、J2EE),实施人员
爱唱数码诚聘 研发经理&程序员
【北京联银通科技有限制公司】高薪诚聘技术经理、高级工程师等职位
【安博教育】诚聘软件开发、架构师、技术总监等技术人才
【Autodesk】欧特克软件(中国)诚聘软件开发,测试,研究员
【北京平川嘉恒】团队Leader及客户端/服务器端研发工程师
加盟跨国开发团队: 爱立信上海急聘多媒体软件开发和测试干将!
东软(天津)、展讯(天津)高薪诚聘程序员(天津空港经济区)
诚聘Android/java工程师,运维,架构师
职场良机:预约5年后中国深具影响力网游研发公司——红石娱动的一席之位
加拿大思拓软件公司诚聘C++、C#开发工程师
网票网急聘.net软件开发工程师,待遇从优
【上海瑞创网络】诚聘互联网技术人才!招(PHP、测试、运维) 经理!
【天元网络】诚聘JAVA、.NET、项目经理、维护工程师
【友友系统】云的架构师 邀您一起驾驭云端能量
【广州菲音】高薪诚聘C++游戏服务器端开发工程师等各类游戏开发人才
知名社交手游公司DeNA China 10K-30K高薪诚聘开发类人才
【盛旋软件】诚聘英才之图形图像、网站开发、游戏开发工程师!
【傲盾软件】高薪诚聘C、C++、JAVA、cavium/linux工程师
【道达天际】高薪诚聘:渗透测试、网络安全、逆向技术分析 专业人才
诚聘高级软件工程师,架构师,待遇从优
【山重融资】诚聘软件开发工程师、网络管理工程师
【卓坤信息】诚聘MFC高级客户端、网页设计师、PHP开发等
爱福康诚招:C++ / Directshow 软件工程师
【天健集团】诚聘架构师,高级软件开发工程师(.NET、PB、J2EE),实施人员
爱唱数码诚聘 研发经理&程序员
【北京联银通科技有限制公司】高薪诚聘技术经理、高级工程师等职位
【安博教育】诚聘软件开发、架构师、技术总监等技术人才
【Autodesk】欧特克软件(中国)诚聘软件开发,测试,研究员
【北京平川嘉恒】团队Leader及客户端/服务器端研发工程师


公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知信息技术有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
Email:webmaster@csdn.net
Copyright © 1999-2011, CSDN.NET, All Rights Reserved


   
请使用浏览器的分享功能分享到微信等