我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

这篇文章主要介绍怎么在Shell脚本中跟踪调试命令的执行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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

  1. 如何在 Linux 中启用 Shell 脚本的调试模式

  2. 如何在 Shell 脚本中执行语法检查调试模式

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

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

我们将使用下面的 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" ]; then     echo "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

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

$ chmod +x sys_info.sh $ sudo bash -x sys_info.sh

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

shell 跟踪 - 显示脚本中的错误

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

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

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

$ sudo bash -n sys_info.sh

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

脚本中语法检查

如果我们审视这个 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" ]; then     echo "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

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

在 shell 脚本中执行语法检查

上面的语法检查操作的结果仍然显示在脚本的第 21 行还有一个错误。所以,我们仍然要纠正一些语法。

再一次分析脚本,会发现第 21 行的错误是由于在 print_sys_info 函数内***一个 echo 命令中没有闭合双引号 "。

我们将在 echo 命令中添加闭合双引号并保存文件。修改过的脚本如下:

#!/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" ]; then     echo "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

现在再一次检查语法。

$ sudo bash -n sys_info.sh

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

$ sudo bash -x sys_info.sh

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

跟踪 shell 脚本执行

现在运行脚本。

$ sudo ./sys_info.sh

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

用 shell 脚本显示日期、时间和运行时间

shell 跟踪执行的重要性

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

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

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

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

check_root(){   if [ "$UID" -eq "$ROOT_ID" ]; then     echo "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" ]; then     echo "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 的值为 100,不等于为 0  的 root 的 ROOT_ID 。

$ ./sys_info.sh

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

以上是“怎么在Shell脚本中跟踪调试命令的执行”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

这篇文章主要介绍怎么在Shell脚本中跟踪调试命令的执行,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本系列的前面部分清晰地阐明了另外两种 shell 脚本调试模式:详细模式和语法检查模式,并用易于理解的例子展示了如
2023-06-16

怎么在shell脚本中执行hive和sqoop命令

这篇文章将为大家详细讲解有关怎么在shell脚本中执行hive和sqoop命令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、test.sh脚本内容如下:#!/bin/bash#CURR_
2023-06-09

怎么用命令执行Shell脚本

本篇内容主要讲解“怎么用命令执行Shell脚本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用命令执行Shell脚本”吧!假设这个 shell 脚本的名称为 tinyshell.sh。在 L
2023-06-09

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

这篇文章将为大家详细讲解有关怎么在Shell脚本中执行语法检查调试模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。启用 verbose 调试模式在进入本指导的重点之前,让我们简要地探索下 verbose
2023-06-16

Shell脚本中怎么切换用户并执行命令

这期内容当中小编将会给大家带来有关Shell脚本中怎么切换用户并执行命令,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。系统:centos 5.x脚本内容:cat test.sh代码如下:#!/bin/ba
2023-06-09

如何在shell中使用expect命令进行远程执行命令脚本

如何在shell中使用expect命令进行远程执行命令脚本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。expect是用来实现自动交互功能的工具之一,使用expect-send
2023-06-09

使用Spark-shell怎么批量命令执行脚本

这篇文章给大家介绍使用Spark-shell怎么批量命令执行脚本,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。批量执行spark-shell命令,并指定提交参数#!/bin/bashsource /etc/profil
2023-06-09

使用hbase-shell命令怎么批量执行脚本

今天就跟大家聊聊有关使用hbase-shell命令怎么批量执行脚本,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。批量执行hbase shell 命令#!/bin/bash sourc
2023-06-09

使用hive-shell命令怎么批量执行脚本

使用hive-shell命令怎么批量执行脚本?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如下所示:#!/usr/bin/bashHADOOP_HOME="/o
2023-06-09

shell命令怎么在docker中执行

这篇文章将为大家详细讲解有关shell命令怎么在docker中执行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在docker中执行shell命令,需要在命令前增加sh -c,例如:dock
2023-06-14

Shell脚本中多命令逻辑的执行顺序是什么

本篇文章给大家分享的是有关Shell脚本中多命令逻辑的执行顺序是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.分号";"command1 ; command2命令之间没
2023-06-09

read命令怎么在SHELL脚本中使用

本篇文章给大家分享的是有关read命令怎么在SHELL脚本中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.1 shell read简介要与Linux交互,脚本获取键盘输
2023-06-09

在linux shell脚本中root切换到普通用户执行脚本或命令的方法

需求: 安装deb包,设置程序安装后启动,不需要root权限启动程序 | 不能用root权限启动 其他开机启动选项 方法:root临时降低权限 secUser=`who am i | awk '{print $1}'` #echo
2022-06-04

如何利用 tee 命令调试shell脚本中的管道

实例下面是一个简单的脚本,脚本中 processid 函数的作用是查询指定进程名字的进程ID,在管理linux服务器的过程中,这个是很常见的功能,processid 函数作用是利用多层管道命令查询进程ID,以下是测试脚本源码#!/bin/s
2022-06-04

通过shell脚本怎么循环进入目录执行命令

通过shell脚本怎么循环进入目录执行命令?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。相对应的目录结构如下;laravel框架的目录结构为:/webserver/aaa/ww
2023-06-09

怎么在Linux中使用shell脚本自动执行脚本文件

本篇文章为大家展示了怎么在Linux中使用shell脚本自动执行脚本文件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、定时复制文件  a、在/usr/local/wfjb_web_back目录下
2023-06-09

怎么在Shell脚本中使用sed命令删除特定行

这篇文章将为大家详细讲解有关怎么在Shell脚本中使用sed命令删除特定行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。sed命令常用到的两个选项:-i : 直接在文件上编辑 (edit f
2023-06-09

shell脚本中批量复制及执行命令的示例分析

这篇文章主要介绍了shell脚本中批量复制及执行命令的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,
2023-06-09

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

本篇内容主要讲解“怎么在Linux中启用Shell脚本的调试模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在Linux中启用Shell脚本的调试模式”吧!脚本是存储在一个文件的一系列命令
2023-06-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录