范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

10分钟学会Bash调试

  10 分钟学会 Bash 调试
  shell 是用户和操作系统交互的一个程序,经常用于执行一些自动化或者重复繁琐的任务,现在所有的 Linux 系统基本都自带了该程序,我们只需要编写好shell脚本,直接执行就可以了,不需要额外安装软件、配置编译环境,可以说使用起来非常的方便,但是它在调试方面常常令人头大,本文主要介绍shell脚本常用的调试方法 调试常用选项
  调试shell脚本时,常常用到几个调试选项,让脚本在执行的过程中,会输出一些调试信息,根据调试信息,就可以定位出具体出问题的代码
  具体的选项以及说明如下:
  选项
  说明
  -x
  输出结果之前,先输出执行的命令
  -u
  遇到不存在的变量就会报错,并停止执行
  -e
  发生错误时,终止执行
  -n
  检查语法错误
  -o pipefail
  管道子命令发生错误,终止执行跟踪脚本的执行输出调试信息
  通常,脚本执行之后,只有结果输出,当运行多条命令的时候,就会连续输出多条结果,无法分清哪条命令对应哪条结果, 使用 -x选项,会先输出将要执行的那一行命令的调试信息,然后再执行命令
  现有脚本ta.sh,功能是输出当前日期, 内容如下 #!/bin/bash  echo "today is :"$(date +"%Y-%m-%d")
  我们使用 -x 选项来执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# bash -x ta.sh  ++ date +%Y-%m-%d + echo "today is :2021-07-10" today is :2021-07-10
  从结果中可以看到,在执行前打印出了每一行命令,行前面的  +  号表示调试信息,它实际是环境变量 PS4 的值, PS4 的第一个字符会根据嵌套层次进行重复,命令所处的层次越深,前面的 +  号越多
  结果中第一行表示执行 date +"%Y-%m-%d" 命令,它处于第内层,所以打印两个  +  号 ,第二行表示执行 echo "today is :"$(date +"%Y-%m-%d") 命令,它处于外层,只打印一个 +  号
  把 -x 选项放到 #!/bin/bash 语句后面,执行的时候不带 -x 也能实现同样的效果,上述脚本只需要把  #!/bin/bash  改成 #!/bin/bash -x  即可输出行号
  上面示例中脚本内容很少,试想下,如果脚本内容达到了几百行或者几千行之后,输出每一行命令的提示信息,阅读起来就很费劲了,在这种情况下,我们在每行输出前加上行号,可以直接定位到具体的行
  修改下 ta.sh 脚本,修改后的内容如下 #!/bin/bash   PS4="+${BASH_SOURCE}:${LINENO} " echo "start..." set -x echo "today is :"$(date +"%Y-%m-%d") set +x echo "end..."
  修改之后的脚本加入了  PS4  变量, 它是调试信息的前缀,默认值是 "+" , 我们可以修改它的值,达到输出的调试信息中包含行号的目的
  上述代码中  "${BASH_SOURCE}"  表示 当前执行的shell脚本的相对路径,在这里用来表示脚本文件名,"${LINENO}"  表示行号,修改 PS4  之后,输出的调试信息就会包括 脚本名字以及行号
  我们执行脚本,看下结果 [root@VM-0-2-centos shell_debug]# bash -x ta.sh  + PS4="+${BASH_SOURCE}:${LINENO} " +ta.sh:4 echo start... start... ++ta.sh:5 date +%Y-%m-%d +ta.sh:5 echo "today is :2021-07-10" today is :2021-07-10 +ta.sh:6 echo end... end...
  从结果可以看出,每一行命令的调试信息中都包含了文件名和行号 输出部分调试信息
  有时,我们只需要输出部分调试信息,这个时候就需要我们手动去设置 -x 选项了,把需要输出调试信息的命令放到 set -x 和set +x 之间
  修改下 ta.sh 脚本,内容如下 #!/bin/bash  echo "test..."  set -x echo "today is :"$(date +"%Y-%m-%d") set +x  echo "finish..."
  执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# ./ta.sh  [root@VM-0-2-centos shell_debug]# ./ta.sh  test... ++ date +%Y-%m-%d + echo "today is :2021-07-10" today is :2021-07-10 + set +x finish...
  从结果可以看出,只有  echo today is :"$(date +"%Y-%m-%d")  命令输出了调试信息,set -x 相当于开启调试信息,set +x 则是关闭调试信息
  这里需要注意下,脚本中使用了 set -x 时 , 执行的时候就不要再加 -x 了 日志打印
  通过打印日志来调试shell脚本是常用的方式,在一行命令前后打印变量值或者命令结果,通过日志来判断是否有错误
  但是,当脚本比较长的时候,需要打印的日志就有点儿多了,而且,调试完了后,这些调试日志就不再需要了,这时就要一行行的删掉日志打印
  下面介绍一种方法,把脚本中所有的日志打印加一个开关,当开关打开的时候,就会输出调试相关的日志,不需要的时候,直接关闭开关即可
  现有脚本 debug1.sh, 内容如下 #!/bin/bash  #调试开关, on 表示开启,其他表示关闭 IS_DEBUG="on" #调试开关函数 function _DEBUG() {    [ "$IS_DEBUG" == "on" ] && $@ }  va=1 _DEBUG echo "old value:"$va #变量val加1 let va++ echo "new value:"$va
  上述脚本中, IS_DEBUG 变量是调试开关,"on"  表示开启,其他表示关闭
  _DEBUG()  是调试开关函数,它的功能是:如果 IS_DEBUG  为 "on"  ,执行后面的命令,否则忽略
  先打开调试开关, 执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# ./debug1.sh  old value:1 new value:2
  再关闭调试开关,执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# ./debug1.sh  new value:2
  从上面两组测试结果可以看出,当打开调试开关,也即设置  IS_DEBUG="on"  后, 语句 _DEBUG echo "old value:"$va  会执行 echo "old value:"$va  命令,当 IS_DEBUG="off"  时, 就会忽略 echo "old value:"$va  命令
  所以,当调试的时候,打开调试开关,调试完成之后,脚本不需要做任何修改,只需要关闭开关,调试相关的命令就都不会执行了 常见的错误处理不存在的变量
  执行脚本的时候,遇到不存在的变量,默认会忽略它
  现有脚本 td.sh, 内容如下 #!/bin/bash   echo "start..." echo $ta echo "end..."
  脚本中 ta 是一个不存在的变量,脚本执行结果如下 [root@VM-0-2-centos shell_debug]# ./td.sh  start...  end...
  可以看到,echo $ta 输出了一个空行,脚本直接忽略了不存在的 ta 变量, 并且继续执行后面的命令
  这种情况通常并不是我们希望的结果,遇到不存在的变量,应该直接报错,并停止执行后面的命令,在脚本开头加上 set -u 语句或者执行脚本的时候加上 -u ,可以得到我们期望的结果
  在脚本开头加上 set -u 语句,整个脚本内容如下 #!/bin/bash  set -u echo "start..." echo $ta echo "end..."
  执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# ./td.sh  start... ./td.sh: line 5: ta: unbound variable
  可以看到,加了 set -u 语句之后,遇到不存在的变量 ta, 直接报错,并且停止执行后面的命令
  当然,我们使用 bash -u td.sh 命令执行脚本也会得到相同的结果 语法错误
  语法错误是shell脚本执行错误的原因之一,执行脚本的时候加上 -n, 当脚本有语法错误,不会继续执行,而是打印错误信息
  现有脚本 te.sh, 内容如下 #!/bin/bash  if [ $# -le 0 ];then    echo "no param.."
  输入 bash -n te.sh 命令,并回车,结果如下 [root@VM-0-2-centos shell_debug]# bash -n te.sh  te.sh: line 5: syntax error: unexpected end of file
  上面的脚本中的  if  缺少结尾的 fi , 所以执行 bash -n te.sh 命令之后会出现语法错误的提示
  这个选项很实用,特别是当我们写完shell脚本之后,不要急着执行,先使用 -n 选项检查下有没有语法错误,它可以帮我们提前发现错误 发生错误,终止执行
  一般情况下,脚本执行时发生错误了,还是会继续执行后面的命令
  现有脚本 tf.sh, 内容如下 #!/bin/bash  echo "start..." abc echo "end..."
  执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# ./tf.sh  start... ./tf.sh: line 4: abc: command not found end...
  从结果可以看到,脚本中第四行的  abc  是未知的命令,执行时发生了错误,但是脚本还是继续向后执行,一直到结束
  这种行为不利于脚本的安全和错误排查,在实际应用中,发生了错误应该停止执行脚本,防止错误越积越多,我们可以使用 -e 选项来避免这个问题
  加上 -e 选项,再次执行上述脚本,结果如下 [root@VM-0-2-centos shell_debug]# bash -e ./tf.sh  start... ./tf.sh: line 4: abc: command not found
  从上面结果可以知道,脚本执行到第四行的时候发生了错误,此时脚本停止往下执行了 管道子命令失败,终止执行
  上面提到的 -e 选项有个特殊的情况,不适用于管道命令,管道命令是通过管道符  "|"  组合的命令, 具体的看下面的例子吧
  现有脚本 tg.sh, 内容如下 #!/bin/bash  echo "start..." abc | echo "111" echo "end..."
  脚本的第四行,  abc | echo "111"  是管道命令,我们执行 bash -e ./tg.sh 命令后,结果如下[root@VM-0-2-centos shell_debug]# bash -e ./tg.sh  start... ./tg.sh: line 4: abc: command not found 111 end...
  可以看到,即使使用 -e 选项执行脚本,发生错误的时候,还是会继续往下执行,直到结束
  我们使用 set -o pipefail 来解决这种情况,只要管道命令中一个子命令发生了错误,整个管道命令就失败了,脚本就会终止执行
  修改下上述脚本,内容如下 #!/bin/bash  set -o pipefail echo "start..." abc | echo "111" echo "end..."
  再次执行脚本,结果如下 [root@VM-0-2-centos shell_debug]# bash -e tg.sh  start... tg.sh: line 5: abc: command not found 111
  可以看到,在 tg.sh 脚本开头加上 set -o pipefail 语句之后,再次执行脚本, 管道命令  abc | echo "111"  执行子命令 abc  时发生错误,后续的子命令不再执行了,整个管道命令失败了
  由于执行时加了 -e 选项,当管道命令执行失败了,脚本就会终止执行,所以 echo "end..." 没有执行
  - EOF -

滴滴凉了,中小企业如何保证数据安全?衣在淘宝食在美团住在艺龙行在滴滴。衣食住行是占领市场份额最大的几个领域,这些龙头品牌都有着光明的未来。但作为消费频次最高利润最可观的滴滴,却陷入了前所未有的危机中。7月初,在举国上心级服务养老伴侣,帮助父母放心养老第七次人口普查数据显示,我国60岁及以上人口比重达18。7,人口老龄化程度进一步加深。根据联合国人口司预测,2030年中国60周岁及以上老年人将超过3。5亿。父母在,不远游。可是现3。5TV610AT!豪华硬派越野就该是这个样子它来了,它来了,它带着诱人的动力系统走来了!10月14日,全新雷克萨斯LX600全球首发。新车基于TNGAF平台打造,外观上采用了雷克萨斯家族全新的设计理念,内饰更加豪华,搭载了3一文解析工业安卓一体机在仪器仪表与自动化关系中的作用工业自动化作为目前国内制造业主要发展趋势,是各企业争先布局主要方向,这就带动了智能化设备需求的快速增长。其中,大部分的自动化都需要通过仪器仪表来实现,尤其在石油化工电力制药酿化等行电脑太热太费电?其实跟电源有一定的关系!前言配完电脑最后选择电源,选择电源的第一方向一定是自己的需求瓦数,比如额定多少瓦,接着看品牌价格外观等。但是很多人都会忽略一些电源的关键东西,比如被主动式PFC,转换率等。今天就给小白普及向简单说明主机各个配件之间的生态关系及作用电脑主机的生态关系写给刚入PC门的小白们,简单的讲一讲电脑主机内部配件的各个之间关系以及作用。首先是CPU,它相当于人体的脑袋,核心相当于大脑,线程相当于左右脑,频率相当于智商,一夏天清凉的必需品,三星BESPOKE灵变炫彩系列冰箱C位出彩伴随着暑期的到来,各大体育赛事都在有条不紊的进行中,欧洲杯东京奥运会电竞各种赛事纷至沓来,让体育迷们在炎热的夏季也开始热血起来。激情赛事与炎热夏日碰撞,必定少不了冰可乐冰啤酒的助兴键盘这样排序竟是因为这个原因键盘是我们和电脑之间沟通的桥梁,在最开始使用电脑时,我们就能看到这个占地面积不小的家伙,想要熟悉这个一块又一块的矩阵型设计的东西还需要一定的学习时间,在那个家里有台电脑还很稀罕的年键盘键位冲突的原因是什么,你知道吗?键盘作为最重要的输入设备之一,直接影响着我们的使用感受,今天我们就来聊聊键盘使用过程中按键冲突这个问题。什么叫键位冲突?简单来讲,按键冲突就是同时按下键盘上的几个按键时,系统不能对小米发布真正可用的屏下摄手机Mix4以及平价高画质OLED电视就在今天晚上,小米举行了一场名为2021雷军年度演讲的盛大发布会,在这个发布会上,小米发布了Mix4手机OELD电视智能音箱CyberDog等多款产品以及技术。其中的最大亮点自然是卢伟冰2至3年达成3万家小米之家,国内销量超越OPPO荣耀vivo近日,小米之家万店成就在深圳达成,新店面积达到了600平方米,采用了更为高端的设计风格,更强调场景化体验。与此同时,小米集团合伙人中国区总裁卢伟冰为此也接受了媒体的采访,在采访中介
荣耀70系列开箱视频公开,大胆猜测这次外观设计会有新天地5月17日上午,荣耀官方微博发布了一则关于荣耀70系列的开箱视频,这意味着这款机型即将与我们见面。视频中向我们展现了荣耀70系列的包装礼盒,上面附着明晃晃的数字70以及内包装的荣耀两种设计风格,全新配色亮眼,vivoS15系列真机细节曝光5月16日,vivo官方微博用海报和视频两种形式正式官宣了vivoS15系列的真机外观细节,全面展示了vivoS15系列的迷人风采。从曝出的真机图片中可以看到,vivoS15系列一荣耀新机官宣5月30日,正式发布,旗舰机级别2022年已经过去小半年了,从芯片的发布到现在各大手机品牌的旗舰机发布,手机市场在今年内新机发布量已经有80款以上。从目前的手机市场发展来观看,今年的手机发布量会比去年多,主要是竞新能源电动车永远取代不了燃油车现在很多时候会出现电车取代燃油车的声音,我想说,不管电车怎么发展永远取代不了油车,尤其在中国不可能。中国不像欧美日韩,国土面积小,几百公里续航的电车确实出行压力不大,可是中国呢?东一季度出货下降11后,曝小米OPPOvivo砍单二成,苹果逆势增产5月19日消息,安卓手机阵营再次被曝砍单。据日经亚洲报道,中国三大手机品牌厂小米OPPOvivo已通知供应商,未来几季将砍单约二成。日经引述未具名消息来源指出,小米通知供应链,将把华为Mate50Pro概念机半个机身都是屏幕,放弃购买iPhone14是不是还在期待华为Mate50系列?目前外界普遍推测将于2022年7月份发布,这意味着真机发布会越来越近了。传闻这款手机依旧没有5G支持,就目前的情况而言,其实4G网络已经足够用了象寻公司技术团队被曝被要求20天做出app后被集体开除5月16日,象寻App官微发文称祝象寻早日倒闭刷屏网络,引发关注。作者自称是象寻原技术团队负责人,表示3月末其被要求带领部门人员在20天内开发出象寻APP,在疫情期间,团队天天通宵智慧互通(IICT)重磅发布智能路网(IRN)技术5月18日,智慧互通科技股份有限公司(以下简称IICT)正式发布智能路网(IntelligentRoadNetworkIRN)技术。智能路网是一个具有全息感知自动信控通讯交互全时发一加罕见千元机!Ace竞速版发布首发1899元起5月17日消息,今天晚间,一加Ace竞速版正式发布,号称2K档最强性能真香机。虽然是一加Ace的衍生版,但是竞速版外形有着较大变化,正面为挖空直屏形态,曲面机身,后置相机模组类似于聚焦517世界电信日运营商加快适老化智能建设,助力老年人共享科技发展成果用技术关怀老年健康已经成为当下通信业关注的重点领域。今年517世界电信和信息社会日的主题是面向老年人和实现健康老龄化的数字技术。中国电信董事长柯瑞文在致辞中表示,主题既体现了数字经数字赋能,智造未来七通智能2022年新战略新产品发布会精彩纷呈新征程,新出发!2022年5月5日,七通智能召开了新战略和新产品的发布会,迎来又一里程碑时刻。会议伊始,七通智能董事长武荷银致辞2022年已经走过了三分之一,这一年,对于上海甚至对