Bash 是Linux操作系统的默认Shell脚本。Shell是用来处理操作系统和用户交互的一个程序。Shell的脚本可以帮助用户自动化地和操作系统进行交互。你也可以理解为一种脚本式的编程。即然有编程,那么,程序的编译器,解释器,调试器就必不可少了,Bash也一样,但在调试方面可能会有一些和编程语言不一样的东西和技术,所以,下面这篇文章主要是说明调试bash脚本的各种技术。
跟踪脚本的执行
你可以让bash打印出你脚本执行的过程中的所有语句。这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下。
下面的这段脚本,先是输出一个问候语句,然后输出当前的时间:
- #!/bin/bash
- echo"Hello$USER,"
- echo"Todayis$(date+'%Y-%m-%d')"
下面让我们使用-x选项来运行这段脚本:
- $bash-xexample_script.sh
- +echo'Hellochenhao,'
- Hellochenhao,
- ++date+%Y-%m-%d
- +echo'Todayis2009-08-31'
- Todayis2009-08-31
这时,我们可以看到,bash在运行前打印出了每一行命令。而且每行前面的+号表明了嵌套。这样的输出可以让你看到命令执行的顺序并可以让你知道整个脚本的行为。
在跟踪里输出行号
在一个很大的脚本中,你会看到很多很多的执行跟踪的输出,阅读起来非常费劲,所以,你可以在每一行前加上文件的行号,这会非常有用。要做到这样,你只需要设置下面的环境变量:
export
PS4=
'+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
让我们看看设置上了PS4这个环境变量后会是什么样的输出。
$
bash
-x example_script.sh
+example_script.sh:2::
echo
'Hello chenhao,'
Hello chenhao,
++example_script.sh:3::
date
+%Y-%m-%d
+example_script.sh:3::
echo
'Today is 2009-08-31'
Today is 2009-08-31
调试部份的脚本
有些时候,你并不想调试整个脚本,你只要调试其中的一部份,那么,你可以在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就可以了。如下面的脚本所示:
- #!/bin/bash
- echo"Hello$USER,"
- set-x
- echo"Todayis$(date%Y-%m-%d)"
- set+x
让我们看看运行起来是啥样?
$ .
/example_script
.sh
Hello chenhao,
++example_script.sh:4::
date
+%Y-%m-%d
+example_script.sh:4::
echo
'Today is 2009-08-31'
Today is 2009-08-31
+example_script.sh:5::
set
+x
注意:我们在运行脚本的时候,不需要使用bash -x了。
日志输出
跟踪日志有时候太多了,多得都受不了,而且,输出的内容很难阅读。一般来说,我们很多时候只关心于条件表达式,变量值,或是函数调用,或是循环等。。在这种情况下,log一些感兴趣的特定的信息,可能会更好。
使用log前,我们先写一个函数:
- _log(){
- if["$_DEBUG"=="true"];then
- echo1>&2"$@"
- fi
- }
于是,你就可以在你的脚本中如下使用:
_log
"Copying files..."
cp
src/* dst/
我们可以看到,上面那个_log函数,需要检查一个_DEBUG 变量,只有这个变量是真,才会真正开发输出日志。这样,你就只需要控制这个开关,而不需要删除你的debug信息。
$ _DEBUG=
true
.
/example_script
.sh
使用Bash专用调试器
如果你在写一个相当复杂的脚本,并且,你需要一个完整的像调试别的语言一样的调试器,那么你可以试着用用这个开源软件——
bashdb , 一个Bash的专用调试器。这个调试器很强大,你想得到的功能,他都有,比如,设置断点,单步跟踪,跳出函数,等等。它的用户接口很想GDB,这是他的文档 。
Bash 是Linux操作系统的默认Shell脚本。Shell是用来处理操作系统和用户交互的一个程序。Shell的脚本可以帮助用户自动化地和操作系统进行交互。你也可以理解为一种脚本式的编程。即然有编程,那么,程序的编译器,解释器,调试器就必不可少了,Bash也一样,但在调试方面可能会有一些和编程语言不一样的东西和技术,所以,下面这篇文章主要是说明调试bash脚本的各种技术。
跟踪脚本的执行
你可以让bash打印出你脚本执行的过程中的所有语句。这很简单,只需要使用bash的-x选项就可以做到,下面让我们来看一下。
下面的这段脚本,先是输出一个问候语句,然后输出当前的时间:
- #!/bin/bash
- echo"Hello$USER,"
- echo"Todayis$(date+'%Y-%m-%d')"
下面让我们使用-x选项来运行这段脚本:
- $bash-xexample_script.sh
- +echo'Hellochenhao,'
- Hellochenhao,
- ++date+%Y-%m-%d
- +echo'Todayis2009-08-31'
- Todayis2009-08-31
这时,我们可以看到,bash在运行前打印出了每一行命令。而且每行前面的+号表明了嵌套。这样的输出可以让你看到命令执行的顺序并可以让你知道整个脚本的行为。
在跟踪里输出行号
在一个很大的脚本中,你会看到很多很多的执行跟踪的输出,阅读起来非常费劲,所以,你可以在每一行前加上文件的行号,这会非常有用。要做到这样,你只需要设置下面的环境变量:
export
PS4=
'+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
让我们看看设置上了PS4这个环境变量后会是什么样的输出。
$
bash
-x example_script.sh
+example_script.sh:2::
echo
'Hello chenhao,'
Hello chenhao,
++example_script.sh:3::
date
+%Y-%m-%d
+example_script.sh:3::
echo
'Today is 2009-08-31'
Today is 2009-08-31
调试部份的脚本
有些时候,你并不想调试整个脚本,你只要调试其中的一部份,那么,你可以在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就可以了。如下面的脚本所示:
- #!/bin/bash
- echo"Hello$USER,"
- set-x
- echo"Todayis$(date%Y-%m-%d)"
- set+x
让我们看看运行起来是啥样?
$ .
/example_script
.sh
Hello chenhao,
++example_script.sh:4::
date
+%Y-%m-%d
+example_script.sh:4::
echo
'Today is 2009-08-31'
Today is 2009-08-31
+example_script.sh:5::
set
+x
注意:我们在运行脚本的时候,不需要使用bash -x了。
日志输出
跟踪日志有时候太多了,多得都受不了,而且,输出的内容很难阅读。一般来说,我们很多时候只关心于条件表达式,变量值,或是函数调用,或是循环等。。在这种情况下,log一些感兴趣的特定的信息,可能会更好。
使用log前,我们先写一个函数:
- _log(){
- if["$_DEBUG"=="true"];then
- echo1>&2"$@"
- fi
- }
于是,你就可以在你的脚本中如下使用:
_log
"Copying files..."
cp
src/* dst/
我们可以看到,上面那个_log函数,需要检查一个_DEBUG 变量,只有这个变量是真,才会真正开发输出日志。这样,你就只需要控制这个开关,而不需要删除你的debug信息。
$ _DEBUG=
true
.
/example_script
.sh
使用Bash专用调试器
如果你在写一个相当复杂的脚本,并且,你需要一个完整的像调试别的语言一样的调试器,那么你可以试着用用这个开源软件——
bashdb , 一个Bash的专用调试器。这个调试器很强大,你想得到的功能,他都有,比如,设置断点,单步跟踪,跳出函数,等等。它的用户接口很想GDB,这是他的文档 。
分享到:
相关推荐
-bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...
NULL 博文链接:https://appleses.iteye.com/blog/1936995
解决Centos6.7:-bash: ./DrClientLinux: /lib/ld-linux.so.2: bad ELF 的所有rpm包
主要介绍了Shell脚本bash: ./t.sh:/bin/bash^M:损坏的解释器: 没有那个文件或目录,需要的朋友可以参考下
到此这篇关于Linux bash:./xxx:无法执行二进制文件报错的文章就介绍到这了,更多相关Linux 无法执行二进制文件 内容请搜索软件开发网以前的文章或继续浏览下面的相关文章希望大家以后多多支持软件开发网!...
Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh Ubuntu/Deepin安装脚本 wget -O install.sh ...
这已经下载好了,下载之后,通过 bash ./downloadbyfn.sh 1.1.0 -s 运行。 具体可以看https://blog.csdn.net/u013288190/article/details/112286162
以上所述是小编给大家介绍的解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对软件开发网网站的支持! ...
《高级 Bash 脚本编程指南》是一本广受好评的 Bash 脚本编程著作,原作者是 Mendel Cooper ,其原始版本地址是:http://tldp.org/LDP/abs/html/index.html ,豆瓣链接在此,评分高达 9.0分,其江湖地位斐然,可以...
2. Linux高级Bash脚本编写指南 这两个CHM都是经我整理过的,学习shell编写,用这两个chm就足够了。 Bash脚本编写指南原文请见: http://www.linuxtone.org/docs/abash/html/index.html 在我整理过的chm中,修正了...
前天没事写了一个防CC攻击的Shell脚本,没想到这么快就要用上了,原因是因为360网站卫士的缓存黑名单突然无法过滤后台,导致WordPress无法登录!虽然,可以通过修改本地hosts文件来解决这个问题,但是还是想暂时取消...
terminal init的时候并不会执行~/.bash_profile、~/.bashrc等脚本了, 这是因为其默认启动执行脚本变为了~/.zshrc。 解决办法就是修改~/.zshrc文件,在其中添加: source ~/.bash_profile、~/.bashrc等脚本文件...
在本篇文章里小编给大家整理的是关于linux输入yum后提示: -bash: /usr/bin/yum: No such file or directory的解决方法,有需要的朋友们参考下。
在windows系统下写的python脚本,在linux下赋予权限chmod +x xxx.py 以后,执行./xxx.py运行提示:bash: /usr/bin/autocrorder: /usr/bin/python^M: bad interpreter: No such file or directory 分析: 这是不同...
高级Bash脚本编程指南 一本深入学习shell脚本艺术的书籍 Mendel Cooper <thegrendel@theriver.com> 春敏 杨 - 毅 黄 - 3.9.1 2006年5月26日 这本书假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备...
结合bash和perl脚本,从下载并提取原始用户上传的。用法: subtitlecat.sh < URL> [ < output> ] 第一个参数subtitlecat.com上URL 必需的第二个参数SRT文本文件的输出文件路径绝对或相对于当前工作目录可选的默认: ...
在Linux下使用sqlplus或者rman时,经常需要调用上次或之前运行过的命令 下载包地址: ... 地址2: ... 1. rpm -ivh rlwrap-0.42-1.el7.x86_64.rpm ...2. 检查包是否安装上 rpm -qa rlwrap ...4. 生效: source .bash_profile
本人配置好的,包括很多常用脚本的vim配置,希望有人喜欢
./bin/目录为脚本存放目录,包括配置host文件,关闭防火墙,改为静态NAT连接,卸载系统自带jdk并安装repository目录下的jdk,批量scp ./conf/目录配置nodes文件 根据需要配置 第一行为本机IP及hostname,后面可配置其他...