文章目录

  • shell 脚本调试系列
  • 概述
  • shell 跟踪执行的重要性

shell 脚本调试系列

本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如何在这些模式下启用 shell 脚本调试。

Linux 中启用 Shell 脚本的调试模式

在 Shell 脚本中执行语法检查调试模式

在 Shell 脚本中跟踪调试命令的执行


概述

shell 跟踪简单的来说就是跟踪 shell 脚本中的命令的执行。要打开 shell 跟踪,请使用 -x 调试选项。

这会让 shell 在终端上显示所有执行的命令及其参数。

终端版本

[xgj@entel2 ~]$ lsb_release -a
LSB Version:    :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description:    CentOS release 6.5 (Final)
Release:    6.5
Codename:   Final
[xgj@entel2 ~]$

我们将使用下面的 sys_info.sh shell 脚本,它会简要地打印出你的系统日期和时间、登录的用户数和系统的运行时间。不过,脚本中包含我们需要查找和更正的语法错误。

#!/bin/bash
# script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`check_root(){if [ "$UID" -ne "$ROOT_ID" ]; thenecho "You are not allowed to execute this program!"exit 1;
}print_sys_info(){echo "System Time    : $DATE"echo "Number of users: $NO_USERS"echo "System Uptime  : $UPTIME"
}check_root
print_sys_info
exit 0

注: 在Linux中可以通过 $UID获取 当前用户的id ,root用户的uid 为0

保存文件并执行脚本。脚本只能用 root 用户运行,因此如下使用 sudo 命令运行:

让普通用户xgj具有root的所有权限
执行vim /etc/sudoers之后,可以看见缺省只有一条配置:
root ALL=(ALL) ALL
那么你就在下边再加一条配置:
xgj ALL=(ALL) ALL
这样,普通用户xgj 就能够执行root权限的所有命令

[xgj@entel2 shells]$  chmod +x sys_info.sh
[xgj@entel2 shells]$ sudo /bin/bash -x sys_info.sh

从上面的输出我们可以观察到,首先执行命令,然后其输出做为一个变量的值。

例如,先执行 date,其输出做为变量 DATE 的值。

我们可以执行语法检查来只显示其中的语法错误,如下所示:

$ sudo bash -n sys_info.sh

如果我们审视这个 shell 脚本,我们就会发现 if 语句缺少了封闭条件的 fi 关键字。因此,让我们加上它,新的脚本应该看起来像这样:

#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){if [ "$UID" -ne "$ROOT_ID" ]; thenecho "You are not allowed to execute this program!"exit 1;fi
}
print_sys_info(){echo "System Time    : $DATE" echo "Number of users: $NO_USERS"echo "System Uptime  : $UPTIME"
}
check_root
print_sys_info
exit 0

再次保存文件并以 root 执行,同时做语法检查:

$ sudo bash -n sys_info.sh

再一次检查语法。

$ sudo bash -n sys_info.sh

上面的命令不会产生任何输出,因为我们的脚本语法上正确。我们也可以再次跟踪脚本执行,它应该工作得很好:

$ sudo /bin/bash -x sys_info.sh

现在运行脚本。

$ sudo ./sys_info.sh


shell 跟踪执行的重要性

hell 脚本跟踪可以帮助我们识别语法错误,更重要的是识别逻辑错误。例如,在 sys_info.sh shell 脚本中的 check_root 函数,它用于确定用户是否为 root,因为脚本只允许由超级用户执行。

check_root(){if [ "$UID" -ne "$ROOT_ID" ]; thenecho "You are not allowed to execute this program!"exit 1;fi
}

这里的check_root由 if 语句表达式 ["$ UID" -ne "$ ROOT_ID"] 控制的,一旦我们不使用合适的数字运算符(示例中为 -ne,这意味着不相等),我们最终可能会出一个逻辑错误。

假设我们使用 -eq (意思是等于),这将允许任何系统用户以及 root 用户运行脚本,因此是一个逻辑错误。

check_root(){if [ "$UID" -eq "$ROOT_ID" ]; thenecho "You are not allowed to execute this program!"exit 1;fi
}

注意:我们在本系列开头介绍过,set 这个 shell 内置命令可以在 shell 脚本的特定部分激活调试。

因此,下面的行将帮助我们通过跟踪脚本的执行在其中找到这个逻辑错误:

具有逻辑错误的脚本:

#!/bin/bash
#script to print brief system info
ROOT_ID="0"
DATE=`date`
NO_USERS=`who | wc -l`
UPTIME=`uptime`
check_root(){if [ "$UID" -eq "$ROOT_ID" ]; thenecho "You are not allowed to execute this program!"exit 1;fi
}
print_sys_info(){echo "System Time    : $DATE"echo "Number of users: $NO_USERS"echo "System Uptime  : $UPTIME"
}
#turning on and off debugging of check_root function
set -x
check_root
set +x
print_sys_info
exit 0

保存文件并调用脚本,在输出中,我们可以看到一个普通系统用户可以在未 sudo 的情况下运行脚本。 这是因为 USER_ID 的值为 502,不等于为 0 的 root 的 ROOT_ID 。

$ ./sys_info.sh

在 Shell 脚本中跟踪调试命令的执行相关推荐

  1. Shell脚本中循环select命令用法笔记

    在Shell脚本中,select命令是一种菜单扩展的循环方式. 语法结构如下: select Menu in (list) do command done 说明:当程序运行到select语句时,会自动 ...

  2. Linux系统Shell脚本中的echo命令

    Linux系统Shell脚本中的echo命令 echo的作用       输出字符串 格式                  echo  "字符串内容" 一,显示转义字符 转义字符 ...

  3. Shell脚本中循环until命令用法笔记

    在shell脚本中,可以使用until执行循环处理,如果使用until命令的话如果表达式的结果为false时才执行循环体,直到测试表达式的值为true的时候才会 停止循环. 语法结果如下: until ...

  4. shell脚本判断上一个命令是否执行成功

    shell脚本中判断上一个命令是否执行成功 shell中使用符号"$?"来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败. 结合if-else语句实现判断上一个命 ...

  5. Shell 脚本中 set -ex 命令的作用

    #!/bin/bash -ex shell 命令 set -ex,稍有常识的人都能看出,这是 set 命令加上了 -e 和 -x 两个参数 (废话么这不是).那么,我就把这两个参数拆开,分别说一下它在 ...

  6. shell脚本中如何获取命令的参数(2) ----处理命令参数

    1    找出选项 1.1 处理简单选项 主要可以通过shfit工具对获取的到$1变量对比程序允许的变量值判断: 1.2  从参数中分离选项 一般参数可能在后面跟上适当的参数值,例如 sed   -f ...

  7. shell脚本中使用top命令查看cpu或内存情况的技巧

    在嵌入式系统在做高低温试验的过程中,需要实时记录多个信息,用于分析在故障时刻的数据,辅助判断故障可能产生的原因,如系统重新启动前内存.cpu的占用情况,温度的上升情况等等,今天仅分析cpu和内存的数据 ...

  8. Shell脚本中的交互式命令处理

    先贴代码: DATE=`date -d -1hour +%T` fileName=erver_`date -d now +%Y-%m-%d-%H%M%S`.txt cp /home/BLload_ba ...

  9. 在shell脚本中使用sed命令更改文件中两个相似参数的其中一个

    文件中含有两段数据,第一段是mysql1的配置,第二段是mysql2的配置. [root@ip-10-40-18-118 szh]# cat test.txt mysql1:host: 1.1.1.1 ...

最新文章

  1. 企业运维——机房建设的一些建议
  2. “躲避球”体育游戏《Sparc》登陆Rift和Vive,可以和PS用户一起玩了【附游戏视频】
  3. .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
  4. Python3 如何优雅地使用正则表达式(详解五)
  5. C#模板设计模式使用和学习心得
  6. Oracle学习:事务的基本概念
  7. 转发- css(display,float,position)
  8. 04:求整数的和与均值
  9. 预处理prepareStatement是怎么防止sql注入漏洞的?
  10. .NET简谈组件程序设计之(渗入序列化过程)
  11. 通过BeanPostProcessor理解Spring中Bean的生命周期及AOP原理 1
  12. 解决方法:Linux装完显卡驱动后分辨率显示不正常
  13. 智慧供应链的学习笔记(库存管理、配补货、仓间调拨、控制塔等)
  14. webrtc 的回声抵消算法
  15. CVPR2020目标检测方向论文
  16. 设计 | 分享5个好用的PPT模板网站
  17. adobe illustrator最新版,Illustrator 2022 mac(矢量图制作软件)26.3.1
  18. spring mvc校验部分属性,springmvc校验属性,java.lang.ClassNotFoundException: com.fasterxml.classmate.Filter
  19. 【书评】人月不必再相望,嫦娥已然在身旁——人月神话(40周年纪念版)
  20. 热敏电阻NTC、PTC

热门文章

  1. wide_and_deep 思维导图和代码
  2. 金融量化alpha和beta值的意义
  3. 重温强化学习之深度强化学习
  4. YOLO系列阅读(一) YOLOv1原文阅读:You Only Look Once: Unified, Real-Time Object Detection
  5. pytorch 笔记:gather 函数
  6. torch_geometric 笔记: 数据集Cora 简易 GNN
  7. pytorch笔记——简易回归问题
  8. SpringBoot 源码解析 —— SpringApplication 源码分析
  9. 多变量线性回归程序实现
  10. Hadoop自学笔记(七)Hadoop环境配置和优化