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

server/2024/12/19 2:30:09/

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"' ERRecho "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删除断点

http://www.ppmy.cn/server/151325.html

相关文章

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…

Mac gfortran编译fortran出错

Mac gfortran编译fortran出错提示&#xff1a; ld: unsupported tapi file type !tapi-tbd in YAML file /Library/Developer/CommandLineTools/SDKs/MacOSX15.sdk/usr/lib/libSystem.tbd for architecture x86_64 collect2: error: ld returned 1 exit status 解决办法&…

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础&#xff0c;总结的还行&#xff1b; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

Web项目图片视频加载缓慢/首屏加载白屏

Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…

【ChatGPT出现降智无法画图和联网解决方法】

【ChatGPT出现降智无法画图和联网解决方法】 打开浏览器进入到ChatGPT界面 快捷键F12开发者调试工具 切换到Network&#xff0c;勾选Disable cache 切换到Application 选择Local storage(1)&#xff0c;然后点击Clear All(2)&#xff0c;再点击Refresh(3) 选择Session …

java: 错误: 无效的源发行版:17解决办法

遇到“java: 错误: 无效的源发行版&#xff1a;17”的问题&#xff0c;通常是因为项目设置中指定的Java版本与当前环境不一致导致的。以下是几种可能的解决方案&#xff1a; 检查并升级Java版本&#xff1a;确保你已经安装了支持Java 17的JDK版本。你可以通过命令行输入java -v…

在VMware中设置宿主机和虚拟机的文件夹共享

在VMware中设置宿主机和虚拟机的文件夹共享&#xff0c;可以按照以下步骤进行&#xff1a; 1. **安装VMware Tools**&#xff1a; - 确保虚拟机中已安装VMware Tools&#xff0c;这可以通过在VMware Workstation菜单栏中选择“虚拟机” > “安装 VMware Tools”来完成。…

UUG 深圳站 | Unity 6 新功能详细介绍和演示

附PPT下载链接 在 2024 年 11 月 2 日的 Unity User Group 深圳站活动中&#xff0c;Unity 中国技术支持负责人牟宝玉来演讲《Unity 6 新功能详细介绍和演示》。本文为演讲全程实录。 下载演讲PPT&#xff1a;https://u3d.sharepoint.cn/:f:/s/UnityChinaResources/EsYaYWapDB…