在shell中,最简单的调试助手时输出语句echo,能够通过把很多echo语句放到代码中进行调试,但必须花费足够的时间以定位

要查看的信息。可能必须通过很多的输出才干发现要查找的信息。

1.set选项

最主要的时set -o命令选项,当执行脚本时,这些选项能够用在命令行上。例如以下表所看到的:
set -o选项      命令行选项      行为
noexec            -n                     不执行命令,值检查语法错误
verbose           -v                     在执行命令前回送它们
xtrace               -x                     回送进行替换处理后的命令

脚本a.sh的内容为:
set -n

if cd /dev; do

echo "in dev
运行脚本结果:
$ ./a.sh 

./a.sh: line 2: syntax error near unexpected token `do'

./a.sh: line 2: `if cd /dev; do'
d

脚本a.sh的内容为:
set -v

echo "1"

echo "2"
运行脚本结果:
$ ./a.sh 

echo "1"

1

echo "2"

2
 
脚本a.sh的内容为:
set -x

echo "$PWD"
运行脚本结果:
++ echo /home/yanwenjie/bashtest

/home/yanwenjie/bashtest
-x选项将回送经过參数替换、命令替换和其它命令行处理步骤后得到的命令行结果。

x选项在每一行開始都打印+,(可是不知道为什么我这边打印了2个),这实际上能够定制的,它是内置变量shell变量PS4的值。能够
通过改动PS4的值来改动这个符号。

比如脚本a.sh的内容例如以下:
PS4="debug->"
set -x

echo "$PWD"
运行结果:
$ ./a.sh 

ddebug->echo /home/yanwenjie/bashtest

/home/yanwenjie/bashtest
(不知道为什么这边出现了2个d。

。谁能回答一下)


让我们简单回想一下PS1,PS2,PS3的作用:
PS1是用来控制shell提示符的样式。比如我登陆shell的式样是:root@ywjPC:~# 
PS2是当我们输入"\"时。多行提示符的样式,默认是">".
PS3是Shell脚本中使用select时的提示符。

2.伪信号

伪信号和工作方式和trap一样。但它们时由shell本身产生,能够像对待shell脚本里的实际信号一样对待它。

伪信号     发送时间
EXIT         shell从脚本中退出后
DEBUG   shell已经运行了一个语句



注意:是伪信号,在真正的信号中是不包括这两个的。

linux的信号例如以下:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP  
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1  
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM  
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP  
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ  
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR  
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13  
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12  
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  

63) SIGRTMAX-1  64) SIGRTMAX


2.1.EXIT

比如以下的脚本a.sh:
trap "echo 'exit from shell'" EXIT

echo "hello"
运行结果:
# ./a.sh 

hello

exit from shell
比如採用kill的方式则无法运行trap代码。

2.2.DEBUG

DEBUG用来在一个函数或脚本内全部语句后运行陷阱代码。

它的主要用途是用来作为一种跟踪错误的程序状态元素的强制性

方法。
比如以下的脚本a.sh:
function dbgtrap

{

echo "i=$i"

}



i=1

trap dbgtrap DEBUG

i=$((i+1))

i=$((i+1))

i=$((i+1))

trap - DEBUG
脚本中两个trap之间的每条语句运行后都会运行dbgtrap函数。包括第一个trap语句。

运行结果:
# ./a.sh 

i=1

i=2

i=3

i=4
当中i=1是trap dbgtrap DEBUG语句运行后输出的。

《学习bash》笔记--调试shell程序的更多相关文章

  1. linux下的Shell编程(7)使用-x和-n调试shell程序

    我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了.Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数. sh -x filename ...

  2. Linux Shell 程序调试

    Linux Shell 程序调试 Shell程序的调试是通过运行程序时加入相关调试选项或在脚本程序中加入相关语句,让shell程序在执行过程中显示出一些可供参考的“调试信息”.当然,用户也可以在she ...

  3. shell脚本,通过一个shell程序计算n的阶乘。

    [root@localhost ~]# cat jiechen.sh #!/bin/bash #设计一个shell程序计算n的阶乘,要求: #.从命令行接收参数n; #.在程序开始后立即判断n的合法性 ...

  4. 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)

    第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...

  5. Linux系统学习笔记之 1 一个简单的shell程序

    不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步: ...

  6. 学习Shell脚本编程(第2期)_编写修改权限及执行Shell程序的步骤

    编写Shell程序 执行Shell程序 Shell程序有很多类似C语言和其他程序设计语言的特征,但是又没有程序语言那样复杂.Shell程序是指放在一个文件中的一系列Linux命令和实用程序.在执行的时 ...

  7. Bash技巧:使用 set 内置命令帮助调试 shell 脚本

    Bash技巧:使用 set 内置命令帮助调试 shell 脚本 霜鱼片发布于 2020-02-03   在 bash 中,可以使用 set 内置命令设置和查看 shell 的属性.这些属性会影响 sh ...

  8. #Linux学习笔记# 自定义shell终端提示符

    我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...

  9. 第十一章、认识与学习 BASH Bash Shell 的操作环境

    bash中的变量动不动就说环境变量,真是奇怪,bash只是一个c语言编写的程序而已,跟环境变量有什么关系?如果知道dos的历史的话就知道有个时代是只有命令行界面而没有图形用户界面,这只小小的程序就包揽 ...

随机推荐

  1. iOS开发UI篇—自定义layer

    一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的DrawRect:方法,然后在该方法中画图. 绘制图形的步骤: ...

  2. [HNOI2011][bzoj 2329] 括号修复 [splay+前缀和]

    题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护 ...

  3. 2017-3-01 test

    三道好像都是HDU上的题QAQ 题目名称都没改,差评 T1:http://acm.hdu.edu.cn/showproblem.php?pid=5073 被卡精度了QAQ 先排一发序,然后发现最后未动 ...

  4. [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)

    题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...

  5. 在react项目当中使用redux

    如果需要在你的react项目当中使用状态管理模式的话,需要引入redux和react-redux两个插件,redux提供基本的功能,react-redux提供将redux注入react的方法. imp ...

  6. poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树

    题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...

  7. 所驼门王的宝藏(bzoj 1924)

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  8. 【Vue起步-Windows】N01:环境安装

    本文基于“vue.js安装过程(npm安装)”文章内容及个人出现的问题整合而成. 1.安装npm环境 在Node官网中下载最新的windows版msi安装包,并默认所有安装选择. 2.查看npm安装版 ...

  9. 無法使用 system/bin/r 讀取 pmic pm8937 hardware regitster 的原因

    Platform Qualcomm MSM8917 + PM8937 + PMI8940 起因 同事問我 PM8937 的 VREG_L17 如何設定成 3.3V, 從 PM8937 hardware ...

  10. bq25890 ship mode

    Precondition 此是以 evb board 來做實驗的. 沒接 Vbus 僅接 i2c ,仍可以 讀寫 i2c register,但是 adc 似乎不能 working, evb board ...