在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. jquery的html、text、val的用法

    .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对比 .html(),.text() ...

  2. Kotlin-Not enough information to infer parameter T in fun<T:View> findViewById(id: Int): T!

    代码改变世界 错误: Type inference failed : Not enough information to infer parameter T in fun<T:View> ...

  3. Mysql架构之主从复制

    author:JevonWei 版权声明:原创作品 主从复制架构 架构角色 mysql-master:192.168.198.139 mysql-slave:192.168.198.128 主数据库和 ...

  4. css中按钮的四种状态

    css中按钮有四种状态 1. 普通状态2. hover 鼠标悬停状态3. active 点击状态4. focus 取得焦点状态 .btn:focus{outline:0;} 可以去除按钮或a标签点击后 ...

  5. BJOI2019退役记

    update:不想更这个游记……感觉更了只能说明自己菜得只会打嘴炮……那就让这个污痕一直残缺吧 太菜了,就不发具体分数了…… 被北师大附中的高一选手们吊打致死,退役了 4.6 4.7 4.13 4.1 ...

  6. 替换/重制Homebrew源

    homebrew主要分两部分:git repo(位于GitHub)和二进制bottles(位于bintray),这两者在国内访问都不太顺畅.可以替换成国内的镜像,git repo国内镜像就比较多了,可 ...

  7. DBus介绍

    1. 介绍 DBus是一种桌面环境的进程间通讯(IPC)机制,有低时延.低消耗等优点 基于socket,提供了一对一的对等通讯:使用dbus-daemon作为后台进程时,可实现多对多通讯 由如下三个层 ...

  8. (二)docker的部署安装,配置,基础命令

    一.docker 的安装部署 这里不过多介绍,下面这两个linux发型版 安装可以参考 ubuntu的 docker-ce安装 centos7的 docker-ce安装 二.docker配置文件 重要 ...

  9. failed to obtain a cell from its dataSource 问题处理

    最近在处理bugly问题的时候,总会看到回话列表有奔溃,但是由于没有啥具体的细节原因也无从下手. 只知道ConversationListViewController这个类的奔溃,报的问题是这个,也只有 ...

  10. FZU 1078 计算循环冗余码【模拟】

    计算机网络中采用循环冗余码来校验数据的正确性.其原理是:发送方计算出待发送的二进制数据的循环冗余码,并随同原数据一起发送到接收方:接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比 ...