005.终端信息、日期、调试

编写命令行shell脚本时,总是免不了处理当前终端的相关信息,比如行数、列数、光标位置、遮盖的密码字段等。tput和stty是两款终端处理工具。

1、获取终端信息
a. tput 命令

获取终端行数

tput cols

获取终端列数

tput lines

打印当前的终端名

tput longname

将光标移动到坐标(100,100)处

tput cup 100 100

设置终端背景色n∈[0,7]

tput setb n

设置文本样式为粗体

tput bold

设置下划线的起点位置

tput smul

设置下划线的终止位置

tput rmul

删除从当前光标位置到行尾的所有内容:

tput ed

b. stty 命令

输入密码时,脚本不应该显示输入内容。在下面的例子中,我们将看到如何使用stty来实现这一需求:

#!/bin/sh
#Filename: password.sh
echo -e "Enter password: "

# 在读取密码前禁止回显
stty -echo				# 禁止将输出发送到终端
read password

# 重新允许回显
stty echo					# 允许输出发送到终端
echo
echo Password read.

注意:stty命令的选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。

2、获取并设置日期
date 命令

延时可以用来在程序执行过程中等待一段时间(比如1秒),或是每隔几秒钟(或是几个月)监督某项任务。与时间和日期打交道需要理解如何描述并处理这两者。

日期能够以多种格式呈现。在系统内部,日期被存储成一个整数,其取值为自1970年1月1日0时0分0秒起所流逝的秒数。这种计时方式称为纪元时或Unix时间。可以在命令行中设置系统日期:

# 读取日期
date

#打印纪元时
date +%s

# 将日期转换为纪元时
date --date "Web mar 15 08:09:16 EDT 2017" +%s

# 根据指定的日期找出这一天是星期几
date --date "Jan 20 2001" +%A

# 用带有前缀+的格式化字符串作为date命令的参数,自定义打印格式
date "+%d %B %Y"		# 输出:日 月 年

# 设置日期和时间
date -s "格式化日期字符串"
date -s "21 June 2009 11:01:22"			# Sun Jun 21 11:01:22 CST 2009

要优化代码,首先得先进行测量。date命令可以用于计算一组命令所花费的执行时间:

start=$(date +%s)
......
......
end=$(date +%s)
difference=$((end - start))
echo Time taken to execute commands is $difference seconds.
  • Unix纪元时被定义为从世界标准时间(Coordinated Universal Time,UTC)1970年1月1日0时0分0秒起至当前时刻的总秒数,不包括闰秒。
  • 当计算两个日期或两段时间的差值时,需要用到纪元时。将两个日期转换成纪元时并计算出两者之间的差值。
3、获取并设置延时

编写以循环方式运行的监控脚本时,设置时间间隔是必不可少的。

在脚本中生成延时:sleep命令可以延迟脚本执行一段时间(以秒为单位)。下面的脚本使用tput和sleep从0开始计时到40秒:

#!/bin/bash
#filename: sleep.sh

echo Count:
tput sc

# 循环40秒
for count in `seq 0 40`
do
	tput rc
	tput ed
	echo -n $count
	sleep 1
done
  • 我们用tput sc存储光标位置。
  • 变量依次使用了由seq命令生成的一系列数字。
  • 在每次循环中,通过tput rc恢复之前存储的光标位置,在终端中打印出新的count值,然后使用tputs ed清除从当前光标位置到行尾之间的所有内容。行被清空之后,脚本就可以显示出新的值。
  • sleep可以使脚本在每次循环迭代之间延迟1秒钟。
4、脚本调试

调试脚本所花费的时间常常比编写代码还要多。所有编程语言都应该实现的一个特性就是在出现始料未及的情况时,能够生成跟踪信息。调试信息可以帮你弄清楚是什么原因使得程序行为异常。每位系统程序员都应该了解Bash提供的调试选项。我们可以利用Bash内建的调试工具或者按照易于调试的方式编写脚本

-x选项会输出脚本中执行过的每一行。不过,我们可能只关注其中某一部分代码。针对这种情况,可以在脚本中使用set builtin来启用或禁止调试打印。

set -x

在执行时显示参数和命令。

set +x

禁止调试

set -v

当命令进行读取时显示输入。

set +v

禁止打印输入

使用选项-x,启用shell脚本的跟踪调试功能:bash -x myScripts.sh

使用set -x和set +x对脚本进行部分调试。

#!/bin/bash
# filename: debug.sh
for i in {1..6};
do
	set -x
	echo $i
	set +x
done
echo "Script executed"
  • 在上面的脚本中,只会打印出echo $i的调试信息,因为使用-x和+x对调试区域进行了限制。
  • 该脚本并没有使用上例中的seq命令,而是用{start..end}来迭代从start到end之间的值。这个语言构件(construct)在执行速度上要比seq命令略快。

前面介绍的调试方法是Bash内建的。它们以固定的格式生成调试信息。但是在很多情况下,我们需要使用自定义的调试信息。可以通过定义 _DEBUG环境变量来启用或禁止调试及生成特定形式的信息。

#!/bin/bash

function DEBUG()
{
	[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..10}
do
	DEBUG echo "I is $i"
done

可以将调试功能设置为on来运行上面的脚本:

$ _DEBUG=on ./script.sh
  • 每一条需要打印调试信息的语句前加上DEBUG。如果没有把 _DEBUG=on传递给脚本,那么调试信息就不会打印出来。

利用shebang来进行调试:

把shebang从#!/bin/bash改成 #!/bin/bash -xv,这样一来,不用任何其他选项就可以启用调试功能了。

如果每一行前面都加上+,那么就很难在默认输出中跟踪执行流程了。可以将环境变量PS4设置为'$LINENO:',显示出每行的行号:PS4='$LINENO:'

调试的输出信息可能会很长。如果使用了-x或set -x,调试输出会被发送到stderr。可以使用下面的命令将其重定向到文件中:sh -x testScript.sh 2> debugout.txt

Bash 4.0以及后续版本支持对调试输出使用自定义文件描述符:

exec 6> /tmp/debugout.txt
BASH_XTRACEFD=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/148018.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java创造对象

java创造对象主要分为以下几个步骤 获取对应的类,查看是否加载,如果没有加载把类进行加载根据类的信息可以直接获取到实例的大小,分配对应内存调用实例的方法 比如说 class bb implements Serializable {private String bb; }class aa ext…

【C#学习】给FormClosing增加消息响应函数

第一步:增加消息句柄 第二步:编写消息函数 private void Form1_FormClosing(object sender, FormClosingEventArgs e) {//add your code hereserialPort1.Close();}

【23真题】懒得出题!连续两年试卷相同!

连续两年出题一样,老师都懒得出题的院校又被我抓到一所!(上次是天津工业22和21年一模一样),这次沈阳工业的老师多多少少改了几个数,但是也大差不差,考这所院校,猛刷真题,…

亚马逊鲲鹏系统可全自动化批量操作亚马逊买家号

亚马逊鲲鹏系统可以注册买家号、智能养号、自动下单、自动留评、QA等,是一款从注册到下单于一体的软件。 如果想要自动化注册,那么准备好账号所需要的邮箱、ip、手机号之后就可以进行自动注册了,注册时可以自动输入账号密码信息、自动接收验证…

11.3SpringMVC

一.概念 1.SpringMvc: a.构建在Servlet(api)基础上. b.是一个Web框架(HTTP). c.来自于Spring webMVC模块. 2.MVC 二.注册路由的注解 1.RequestMapping("/test") // 路由注册 注意: 这个注解在类和方法上都要使用,代表不同等级的路由. 2.RestController a)R…

ALPC_Natural_Selection

刚刚结束的ICPC2023沈阳是自然选择号的最后一场 XCPC 区域赛,很高兴也很幸运能拿到校排名 rk4,圆了一个这半年才开始做的梦。在这里讲一下这支队伍的故事。 组队、训练 本来和wjy666(aka maple)打完 EC Final 之后是想要退役的&…

“程序员们的奔溃瞬间”——分享你最令你哭笑不得的程序员经历

文章目录 每日一句正能量前言编程趣事后记 每日一句正能量 每件事最后都会是好事。如果不是好事,说明还没到最后。 前言 作为程序员,我们时常会遇到各种奇怪的错误和挑战,有时候我们会崩溃,但更多的时候,我们会从中学…

从0开始学习JavaScript--JavaScript基础

JavaScript作为一门前端编程语言,在现代web开发中扮演着不可替代的角色。它不仅为网页增添了动态和交互性,而且随着Node.js的崛起,也在服务器端开发中占据了重要地位。在本章节中,我们将探讨JavaScript的作用、重要性以及与其他前…

第二证券:大爆发!道指一夜大涨近500点

当地时间11月14日,美股三大股指显着上涨,其间,道指涨1.43%,标普500指数涨1.91%,纳斯达克指数涨2.37%。 标普500指数创4月份以来的最大单日涨幅。美债收益率大跌。美国10月CPI数据进步了美联储结束加息行为的希望&…

Find My平衡车|苹果Find My技术与平衡车结合,智能防丢,全球定位

随着人们环保意识的加强,电动车的数量与日俱增。与此同时,科学家经过潜心的研究,终于开发出新款两轮电动平衡车。两轮电动平衡车是一种新型的交通工具,它与电动自行车和摩托车车轮前后排列方式不同,而是采用两轮并排固…

舞台演出控制软件:QLab Pro

QLab Pro是一款功能强大的现场多媒体控制器软件,专为Mac用户设计。它提供了一个直观简洁的用户界面,使得用户能轻松管理和组织所有的媒体资源。QLab Pro支持导入各种音频和视频文件,并具备强大的音频、视频处理和灯光控制功能,可以…

Umi-OCR :一个完全离线的OCR图片转文字识别软件。

Umi-OCR :一个完全离线的OCR图片转文字识别软件。 开源免费,支持截屏或批量导入图片,并能识别多国语言,合并段落,处理竖排文字。 排除图片中的水印区域,提取干净的文本。 忽略特定区域的文字识别&#x…

什么是Vue.js中的单向数据流(one-way data flow)?为什么它重要?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

colormap与colorbar应用

一,colormap 常见色度枚举值如下 应用如下 img cv2.applyColorMap(img, cv2.COLORMAP_JET) cv2.imshow(img,img) cv2.waitKey(0) cv2.destroyAllWindows() 常用的COLORMAP_JET效果如下,该模式常用于生成热力图 二,colorbar colorbar所有…

洗袜子的洗衣机哪款好?家用小洗衣机推荐

最近这两年在洗衣机中火出圈的内衣洗衣机,它不仅可以清洁我们较难清洗的衣物,自带除菌功能,可以让衣物上的细菌,还能在清洗的过程中呵护我们衣物的面料,虽然说它是内衣洗衣机,它的功能不止可以清洗内衣&…

VS2017新建.hpp文件

目录 1、新建h文件的方法:2、新建对用的cpp文件:3、在main.cpp中调用 1、新建h文件的方法: 2、新建对用的cpp文件: 3、在main.cpp中调用 参见大佬博客

[Linux]tcpdump抓包工具

windows中的抓包工具:wireshark linux中的抓包工具:tcpdump cpdump是Linux系统中自带抓包工具 [rootIKUN ~]# rpm -q tcpdump tcpdump-4.9.0-5.el7.x86_64 [rootIKUN ~]# tcpdump tcp -i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.1…

SaleSmartly新增AI意图识别触发器!让客户享受更精准的自动化服务

AI意图识别技术是对话式AI中很重要的组成部分,通俗点来说就是一种可以识别用户在对话中表达的意图的技术。通过对大量数据的分析和学习,AI可以理解用户想要获得的信息,并根据这些信息来采取相应的行动或提供相应的响应。而在对话式AI中&#…

node将package.json中的包降为低版本或者升级为高版本

前言 比如现在你用某个包的当前版本,但是你安装的版本高了,那么你应该这么做 1.首先删除node项目中的node_modules目录,防止安装时的包不一致 如果没安装就忽略 例如将package.json中的view-design包降为^4.6.1,当前view-design的版本为^4.…

适合苹果电脑的格式转换器,你都知道几个

我之前都是用windows电脑的,现在突然换了苹果电脑,如何使用苹果电脑进行格式转换呢?有没有好用的格式转换器呢? 不要着急,本文将为你介绍几款常见的格式转换器,可让你轻松的在苹果电脑上进行格式的转换。 …
最新文章