【linux】shell(37)-脚本调试

1. 使用 Shell 调试选项

Shell 提供了多种调试选项,可以用于检查脚本的语法和执行过程。

1.1 -n 选项

作用:读取脚本但不执行,用于检查脚本的语法错误。

用法:

bash -n script.sh

示例:

#!/bin/bash
echo "Hello World"
echo "Missing quote

执行:

bash -n script.sh

输出:

script.sh: line 3: unexpected EOF while looking for matching `"'

1.2 -v 选项

作用:在执行脚本时,将执行的每一行命令打印到标准输出。

用法:

bash -v script.sh

示例:

#!/bin/bash
echo "This is line 1"
echo "This is line 2"

执行:

bash -v script.sh

输出:

#!/bin/bash
echo "This is line 1"
This is line 1
echo "This is line 2"
This is line 2

1.3 -x 选项

作用:提供详细的执行跟踪信息,将每条命令及其参数的展开过程输出到标准错误。

用法:

bash -x script.sh

示例:

#!/bin/bash
x=5
echo "x is $x"

执行:

bash -x script.sh

输出:

+ x=5
+ echo 'x is 5'
x is 5

2. 在脚本中启用调试模式

您可以在脚本内部使用 set 命令启用或禁用调试选项:

2.1 启用调试

set -x  # 启用 -x 选项

2.2 禁用调试

set +x  # 禁用 -x 选项

示例:

#!/bin/bash
echo "Before debugging"
set -x  # 启用调试模式
x=10
echo "x is $x"
set +x  # 禁用调试模式
echo "After debugging"

执行:

bash script.sh

输出:

Before debugging
+ x=10
+ echo 'x is 10'
x is 10
After debugging

3. 使用 trap 捕获错误

trap 命令可以捕获脚本中的错误,输出错误信息并执行指定操作。

用法:

trap 'echo "Error at line $LINENO"' ERR

示例:

#!/bin/bash
trap 'echo "Error occurred at line $LINENO"' ERR

echo "This is a test script"
cd /nonexistent_directory  # 会触发错误
echo "This line will not be executed"

执行:

bash script.sh

输出:

This is a test script
Error occurred at line 5

4. 逐行调试脚本

逐行调试可以帮助您观察脚本的执行过程。

方法: 在脚本中插入 read 命令,逐行暂停并等待用户输入。

示例:

#!/bin/bash
echo "Step 1: Initializing..."
read -p "Press Enter to continue..."
echo "Step 2: Processing..."
read -p "Press Enter to continue..."
echo "Step 3: Finished."

执行脚本时,按 Enter 键逐步执行每个步骤。


5. 输出变量值进行调试

在脚本中添加 echo 语句,可以输出变量的值来帮助定位问题。

示例:

#!/bin/bash
x=10
echo "Debug: x is $x"
y=$((x+5))
echo "Debug: y is $y"

执行:

bash script.sh

输出:

Debug: x is 10
Debug: y is 15

6. 重定向调试信息

将调试信息输出到文件,便于后续分析。

方法:

bash -x script.sh > debug.log 2>&1

说明:

  • > debug.log:将标准输出重定向到文件 debug.log

  • 2>&1:将标准错误重定向到标准输出。


7. 使用 bashdb 交互式调试工具

bashdb 是一个强大的交互式 Bash 脚本调试工具,类似于 GDB(GNU Debugger),可以帮助用户逐步执行和调试 Bash 脚本,定位脚本中的问题。


7.1 安装 bashdb

在大多数 Linux 发行版中,bashdb 可能不是默认安装的,您需要手动安装。

7.1.1 在基于 Debian 的系统上(如 Ubuntu)

sudo apt update
sudo apt install bashdb

7.1.2 在基于 Red Hat 的系统上(如 CentOS 或 RHEL)

sudo yum install bashdb

7.1.3 在 macOS 上

如果使用 Homebrew,可以通过以下命令安装:

brew install bashdb

7.1.4 验证安装

安装完成后,执行以下命令检查是否成功安装:

bashdb --version

输出示例:

bashdb, the Bash Debugger, version 5.0-1.1

7.2. 启动 bashdb

使用 bashdb 调试脚本时,您需要将脚本文件作为参数传递给 bashdb

7.2.1 基本启动命令

bashdb script.sh
  • script.sh:要调试的 Bash 脚本文件。

7.2.2 启动并传递参数

如果脚本需要参数,可以在启动时传递:

bashdb script.sh arg1 arg2

7.3. bashdb 的基本操作与命令

7.3.1 帮助命令

  • help:显示帮助菜单。

  • help <command>:查看特定命令的帮助信息。

示例:

help break

7.3.2 运行与继续执行

  • runr:从脚本的开头开始执行。

  • continuec:继续执行直到遇到断点或脚本结束。

示例:

bashdb script.sh
run

7.3.3 单步调试

  • steps:单步执行脚本,进入函数内部。

  • nextn:单步执行,但跳过函数调用。

示例:

s    # 执行下一步并进入函数
n    # 执行下一步但跳过函数

7.3.4 查看脚本代码

  • listl:显示当前行的上下文代码。

  • list <line>:显示指定行附近的代码。

示例:

l      # 显示当前行的上下文
l 20   # 显示第 20 行附近的代码

7.3.5 设置断点

  • break <line>b <line>:在指定行设置断点。

  • break <function>:在指定函数的开头设置断点。

  • info breakpoints:显示所有已设置的断点。

示例:

b 10            # 在第 10 行设置断点
b my_function   # 在 my_function 函数设置断点
info breakpoints  # 查看所有断点

7.3.6 监控变量值

  • print <variable>p <variable>:打印变量的当前值。

  • set <variable>=<value>:修改变量的值。

  • info variables:查看当前所有变量及其值。

示例:

p x       # 输出变量 x 的值
set x=10  # 将变量 x 设置为 10
info variables  # 显示所有变量

7.3.7 删除断点

  • clear <line>:删除指定行的断点。

  • delete <breakpoint>:删除指定编号的断点。

示例:

delete 1  # 删除编号为 1 的断点
clear 10  # 清除第 10 行的断点

7.3.8 执行脚本中的命令

  • eval <command>:执行脚本中的任意 Bash 命令。

  • source:重新加载脚本。

示例:

eval echo $PATH   # 执行任意命令

7.4. bashdb 调试示例

下面是一个使用 bashdb 调试的示例脚本:

示例脚本(example.sh):

#!/bin/bash
x=5
y=10
result=$((x + y))
echo "The result is: $result"

7.4.1 启动调试

bashdb example.sh

7.4.2 调试过程

(bashdb) list       # 查看代码
(bashdb) break 3    # 在第 3 行设置断点
(bashdb) run        # 执行脚本
(bashdb) print x    # 查看变量 x 的值
(bashdb) next       # 单步执行下一行
(bashdb) print result  # 查看 result 的值
(bashdb) continue   # 继续执行脚本

常用命令速查表

命令说明
run / r开始执行脚本
continue / c继续执行直到下一个断点
step / s单步执行并进入函数
next / n单步执行但跳过函数
break / b设置断点
print / p输出变量的值
list / l查看代码
info显示断点、变量等信息
delete删除断点

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

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

相关文章

微服务SpringCloud链路追踪之Micrometer+Zipkin

视频教程&#xff1a; https://www.bilibili.com/video/BV12LBFYjEvR 效果演示 当我们发送一个请求给 Gateway 的时候&#xff0c;由 Micrometer trace 进行链路追踪和数据收集&#xff0c;由 Zipkin 进行数据展示。可以清楚的看到微服务的调用过程&#xff0c;以及每个微服务…

Leetcode 插入区间

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> result new ArrayList<>();int i 0;// Step 1: 添加所有在 newInterval 之前的区间while(i < intervals.length && intervals[i][1] < newInterval[0]…

CSS|07 标准文档流

标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…

redis 缓存使用

工具类 package org.springblade.questionnaire.redis;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factor…

【排序算法】——选择排序

前言 排序(Sorting) 是计算机程序设计中的一种重要操作&#xff0c;它的功能是将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个关键字有序的序列。所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#x…

递归实现指数型枚举(递归)

92. 递归实现指数型枚举 - AcWing题库 每个数有选和不选两种情况 我们把每个数看成每层&#xff0c;可以画出一个递归搜索树 叶子节点就是我们的答案 很容易写出每dfs函数 dfs传入一个u表示层数 当层数大于我们n时&#xff0c;去判断每个数字的选择情况&#xff0c;输出被选…

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中&#xff0c;请打开终端&#xff1b; 在 Windows 中&#xff0c;请打开 Git Bash。 然后执行以下命令来安装&#xff1a; 部分电脑可能会误报毒&#xff0c;需要关闭杀毒软件/电脑管家/安全防护再进行 方式1&#xff1a;通过…

【AI热点】小型语言模型(SLM)的崛起:如何在AI时代中找到你的“左膀右臂”?

人工智能模型的演变 多年来&#xff0c;谷歌等科技巨头和OpenAI等初创公司&#xff0c;一直在不遗余力地利用海量在线数据&#xff0c;打造更大、更昂贵的人工智能&#xff08;AI&#xff09;模型。这些大型语言模型&#xff08;LLM&#xff09;被广泛应用于ChatGPT等聊天机器…

解决Nginx + Vue.js (ruoyi-vue) 单页应用(SPA) 404问题的指南

问题描述 在使用Vue.js构建的单页应用&#xff08;SPA&#xff09;中&#xff0c;特别是像ruoyi-vue这样的框架&#xff0c;如果启用了HTML5历史记录模式进行路由管理&#xff0c;那么用户直接访问子路径或刷新页面时可能会遇到404错误。这是因为当用户尝试访问一个非根路径时…

Ubuntu22.04配置3D gaussian splatting

这篇博客提供了3D gaussian splatting在新安装Ubuntu上的配置过程。 1.拉仓库 2.安装显卡驱动和cuda版本 3.安装Pytorch 4.安装Pycharm和配置Python 5.安装附加依赖项&#xff08;方法一&#xff09; 6.安装Anaconda&#xff08;方法二&#xff09; 7.测试 1.拉仓库 # HT…

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c

在 Visual Studio Code 中编译、调试和执行 Makefile 工程 llama2.c 1. Installing the extension (在 Visual Studio Code 中安装插件)1.1. Extensions for Visual Studio Code1.2. C/C1.2.1. Pre-requisites 1.3. Makefile Tools 2. Configuring your project (配置项目)2.1.…

深度解析:推荐系统的进化之路与深度学习革命

目录 前深度学习时代一推荐系统的进化之路 浪潮之巅一深度学习在推荐系统中的应用 Embedding 技术在推荐系统中的应用 Embedding的原理 Embedding的分类 Word2vec Item2vec Embedding 与深度学习推荐系统的结合 YouTube 推荐系统召回层 局部敏感哈希 多角度审视推…

MAPTR:在线矢量化高精地图构建的结构化建模与学习(2208)

MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION MAPTR&#xff1a;在线矢量化高精地图构建的结构化建模与学习 ABSTRACT High-definition (HD) map provides abundant and precise environmental information of the driving scene, se…

SpringBoot集成Canal实现MySQL实时同步数据到Redis

MySQL增量数据同步利器Canal环境搭建流程 软件环境 JDK17.0.12 canal-server1.1.7 canal-client1.1.7 MySQL5.7 IDEA2024.2.0.2 我们先看Canal1.1.7源码对应的项目结构 1、基于源码编译打包 # 源码下载地址 https://github.com/alibaba/canal # 执行以下命令&#xff0…

嵌入式驱动开发详解16(音频驱动开发)

文章目录 前言WM8960简介I2S协议接口说明 SAI音频接口简介驱动框架简介设备树配置内核使能声卡设置与测试 后续参考文献 前言 该专栏主要是讲解嵌入式相关的驱动开发&#xff0c;但是由于ALSA驱动框架过于复杂&#xff0c;实现音频编解码芯片的驱动不是一个人能完成的&#xf…

OpenGL ES 03 加载3张图片并做混合处理

OpenGL ES 02 加载3张图片并做混合处理 什么是纹理单元纹理单元的作用使用纹理单元的步骤详细解释加载图片并绑定到到GPU纹理单元采样器的设置1.设置采样器变量的纹理单元编号&#xff0c;目的是为了告诉纹理采样器&#xff0c;从哪个纹理单元采集数据2.如果你没有显式地设置采…

JAVA没有搞头了吗?

前言 今年的Java程序员群体似乎承受着前所未有的焦虑。投递简历无人问津&#xff0c;难得的面试机会也难以把握&#xff0c;即便成功入职&#xff0c;也往往难以长久。于是&#xff0c;不少程序员感叹&#xff1a;互联网的寒冬似乎又一次卷土重来&#xff0c;环境如此恶劣&…

短视频矩阵贴牌:打造品牌新势力的策略与实践

在数字化浪潮席卷全球的今天&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接用户与品牌的重要桥梁。企业为了快速抢占市场&#xff0c;提升品牌影响力&#xff0c;纷纷探索短视频矩阵贴牌这一新兴模式。本文将深入探讨短视频矩阵贴牌的概念、优势、实施流程及注…

视频生成Sora的全面解析:从AI绘画、ViT到ViViT、TECO、DiT、VDT、NaViT等

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

简易记事本项目(基于Vue 3 + Element Plus + SSM 个人事件管理系统)

项目简介 点滴365是一个基于 Vue 3 Element Plus SSM 开发的个人事件管理系统,旨在帮助用户高效管理 个人日程 和 待办事项。系统支持日记撰写、待办事项管理、数据统计分析、图片上传、定时提醒、实时天气等功能,让用户可以更好地记录生活点滴、规划工作任务。 核心技术栈…