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

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.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值