文档章节

Shell脚本调试方法 Shell脚本执行的过程

Mr_Tea伯奕
 Mr_Tea伯奕
发布于 2016/09/09 09:55
字数 915
阅读 32
收藏 3

Shell脚本调试方法 Shell脚本执行的过程

分类:-[小西南]-

 (8434)  (0)

1Shell脚本调试方法

Shell提供了一些用于调试脚本的选项:

 

  • -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误
  • -v,一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
  • -x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来

 

使用这些选项有三种方法。比如现有如下已获取运行权限脚本文件function.sh:

 

#!/bin/sh

foo(){ echo "Shell bash function is called"; }

echo"---start--"

foo

echo"---end--"

分别用Shell脚本调试方法来调试。

 

(1) 命令行提供参数

将以上脚本第二行的“;”去掉。

sh  -n function.sh

function.sh: 7: function.sh: Syntax error:end of file unexpected (expecting “}”)

sh  -v function.sh

#! bin/sh

 

foo() { echo"Shell bash function is called" }

echo"---start--"

foo

echo"---end--"

function.sh: 7: function.sh: Syntax error:end of file unexpected (expecting “}”)

sh  -x  function.sh

function.sh:7: function.sh: Syntax error: end of file unexpected (expecting “}”)

 

 

(2) 脚本开头提供参数

#! /bin/sh  -x

 

只能在脚本开头加入其中一个调试选项。

 

 

(3) 脚本中用set命令启用或禁用调试选项

#! /bin/sh

foo() { echo "Shell bash function iscalled"; }

echo "---start--"

set -v

foo

set +v

echo"---end--"

set -v和set+v分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。./function.sh结果:

 

 

---start—

foo

Shell bash functionis called

set +v

---end

 

避免几种调试选项混用的情况

 

2 Shell执行脚本过程

(1) 执行交互式命令

用户输入一条命,Shell就解释执行一条,这种方式称为交互式。用户在命令行输入命令后,一般情况下Shell会fork并exec该命令(进程控制 [fork() exec() wait() waitpid()])。但是Shell的内建命令例外,执行内建命令相当于调用Shell进程中的一个函数,并不创建新的进程。Shell的内建命令用man bash-builtins命令查看。

 

 

(2) 执行脚本文件

 

Shell会fork一个子进程并调用exec执行脚本文件,exec系统用它的另外一种机制来执行文本文件:如果要执行的是一个文本文件,并且第一行用Shebang(#! /bin/sh)指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器的_start开始执行,而这个脚本文本文件当作命令行参数传给解释器。因此,执行脚本文件相当于执行程序:/bin/sh 脚本文件

 

所以,可以在Shell下直接用“/bin/sh 脚本文件”(指脚本文件内容的第一句即脚本解释器)的方式执行脚本文件,这种方式执行脚本文件还不需要脚本文件的运行权限。

 

 

如现有以下脚本:

#!/bin/sh

cd..

ls

其中cd是Shell的内建命令,ls不是Shell的内建命令(可以用which ls查看)。

 

则Shell执行此脚本的过程如下:

 

  • 交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止。
  • sh读取脚本中的cd..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。
  • sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。
  • ls终止后,sh继续执行,读到脚本文件末尾,sh终止。
  • sh终止后,bash继续执行,打印提示符等待用户输入。

 

[2014.8.11 - 17.17]

 

LCNote Over.

本文转载自:http://blog.csdn.net/misskissc/article/details/38495527

共有 人打赏支持
Mr_Tea伯奕
粉丝 4
博文 212
码字总数 51679
作品 0
朝阳
其他
私信 提问
大神教你如何在 Linux 中启用 Shell 脚本的调试模式

导读 脚本是存储在一个文件的一系列命令。在终端上输入一个个命令,按顺序执行的方法太弱了,使用脚本,系统中的用户可以在一个文件中存储所有命令,反复调用该文件多次重新执行命令。 在学习...

linux小陶
2016/12/20
4
0
Shell编程进阶篇(完结)

   1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行。 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,...

侯召顺
2017/12/12
0
0
SHELL调试方法

如何调试Shell脚本 1) 检查语法错误: 一般来说我们可以通过修改shell脚本的源代码,令其输出相关的调试信息来定位错误,那有没有不修改源代码来调试shell脚本的方法呢?答案就是使用shell的...

xiaofengge315
2014/05/29
0
0
Shell脚本编程学习入门:Shell编程基础

Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): #!/bin/sh......

技术小阿哥
2017/11/12
0
0
三、Shell中分支与循环结构

if结构的语法格式 单分支结构 if then 指令fi if ; then 指令fi 双分支结构 if ; then 指令1else 指令2fi 多分支结构 if ; then 指令1elif 指令2elif 指令3fi shell中的函数 shell函数是she...

运维菜鸟丶
2017/06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

类加载机制过程

1.加载。 将代码转换成字节流加载进内存。加载完之后创建一个Class对象,这个对象是访问数据的入口。 2.验证。 JVM规范验证和代码逻辑验证。 3.准备 内存分配和初始化。对static修饰的类变量...

无精疯
24分钟前
1
0
next.js 提示 chunk styles [mini-css-extract-plugin]

会出现css 导入警告 导入两个插件 并在next.config.js 配置 yarn add webpack-filter-warnings-pluginyarn add mini-css-extract-plugin const FilterWarningsPlugin = require('webpack-......

一箭落旄头
32分钟前
1
0
AWS的自动部署codeploy 应用程序规范文件

codedeploy应用程序的规范文件 ECS平台上的应用规范文件: AppSpec file也可以是 YAML 或 JSON 格式的,可以直接写入控制台内的编辑器内。 AppSpec file用于指定: 用于将流量定向到新任务集...

守护-创造
39分钟前
1
0
Confluence 6 超过当前许可证期限进行升级

这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况。 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似下面的错误提...

honeymoose
45分钟前
2
0
JS 调用Angularjs 的方法

// 1. 获取 Controllerlet appElement = document.querySelector('[data-ng-controller=MessagesCtrl]');let scope = angular.element(appElement).scope();// 2. 调用方法scope.l......

Moks角木
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部