在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. Map 中的EntrySet() ,Map的遍历

      我们循环Map时一般用到EntrySet(),EntrySet() 返回的时Set集合(Set<Map.Entry<K, V>>). 那么这里的有Map.Entry< ...

  2. EasyUi DataGrid 获取选中行的checkbox

    EasyUi DataGrid 获取选中行的checkbox var checked = $(":checkbox[name=ID]:checked"); console.log( ...

  3. Log4j官方文档翻译(二、架构设计)

    log4j遵循层次化架构,每个层都有不同的对象来执行不同的任务.这种层次话的结构灵活设计.易于未来的扩展. log4j框架中有两种对象: 核心对象:框架的支撑对象,是框架必不可少的组成部分. 支撑对象 ...

  4. [NOI2009] 植物大战僵尸 [网络流]

    题面: 传送门 思路: 这道题明显可以看出来有依赖关系 那么根据依赖(保护)关系建图:如果a保护b则连边(a,b) 这样,首先所有在环上的植物都吃不到,被它们间接保护的也吃不到 把这些植物去除以后,剩 ...

  5. 论文笔记《Fully Convolutional Networks for Semantic Segmentation》

    一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...

  6. openssl Rsa 分段加密解密

    密钥长度 1024 openssl genrsa -out rsa_private_key.pem openssl rsa -in rsa_private_key.pem -pubout -out r ...

  7. 支线剧情(bzoj 3876)

    Description [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现 ...

  8. pat 甲级 1127. ZigZagging on a Tree (30)

    1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...

  9. BZOJ【1625】宝石手镯

    1625: [Usaco2007 Dec]宝石手镯 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1007  Solved: 684[Submit][St ...

  10. SQL索引基础

    原文发布时间为:2011-02-19 -- 来源于本人的百度文章 [由搬家工具导入]   一、深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索 ...