shell脚本的执行方式:
#bash test.sh 直接使用指定的bash解释脚本test.sh
#. test.sh 调用默认shell解释执行test.sh
#chmod +x test.sh; ./test.sh 增加可执行权限执行
1、bash test.sh 执行脚本的话不管shell脚本里边是否指定 #!/bin/sh都不会在用指定的sh命令解释器,而是用指定的bash执行脚本,然后启动子shell去执行
测试方法 :echo -e “nihao” ,sh会打印-e这个参数 bash不会打印-e这个参数
在test.sh脚本中写入下面的话
#!/bin/sh
echo -e "nihao"
分别用bash test.sh和./test.sh去执行,看现象。
2、chmod +x test.sh; ./test.sh 增加可执行权限执行,这种方式执行的话也是启动子shel
#bash test.sh 直接使用指定的bash解释脚本test.sh
#. test.sh 调用默认shell解释执行test.sh
#chmod +x test.sh; ./test.sh 增加可执行权限执行
1、bash test.sh 执行脚本的话不管shell脚本里边是否指定 #!/bin/sh都不会在用指定的sh命令解释器,而是用指定的bash执行脚本,然后启动子shell去执行
测试方法 :echo -e “nihao” ,sh会打印-e这个参数 bash不会打印-e这个参数
在test.sh脚本中写入下面的话
#!/bin/sh
echo -e "nihao"
分别用bash test.sh和./test.sh去执行,看现象。
2、chmod +x test.sh; ./test.sh 增加可执行权限执行,这种方式执行的话也是启动子shel
l去执行与第一种方式相同,只是第一种方式指定了用哪一种shell命令解释器去执行脚本,现在这种方式会使用脚本中指定命令解释器去执行脚本,如果脚本中未指定的话,那么使用默认shell去执行。默认shell查看 echo $SHELL 查看系统的默认shell命令解释器。
3、. test.sh 这个执行时在当前的shell中调用当前系统默认的shell命令解析器执行的,不会启动子shell 直接在当前的shell中执行,并且调用系统默认的shell去执行脚本,不管脚本中是不是指定shell命令解析器。
测试方法 :echo -e “nihao” ,sh会打印-e这个参数 bash不会打印-e这个参数
在test.sh脚本中写入下面的话
#!/bin/sh
echo -e "nihao"
分别用 . test.sh和./test.sh去执行。
Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。如果把这个脚本文件加上可执行权限然后执行:
3、. test.sh 这个执行时在当前的shell中调用当前系统默认的shell命令解析器执行的,不会启动子shell 直接在当前的shell中执行,并且调用系统默认的shell去执行脚本,不管脚本中是不是指定shell命令解析器。
测试方法 :echo -e “nihao” ,sh会打印-e这个参数 bash不会打印-e这个参数
在test.sh脚本中写入下面的话
#!/bin/sh
echo -e "nihao"
分别用 . test.sh和./test.sh去执行。
Shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为Shebang)则例外,它表示该脚本使用后面指定的解释器/bin/sh解释执行。如果把这个脚本文件加上可执行权限然后执行:
$ chmod +x script.sh
$ ./script.sh
Shell会fork一个子进程并调用exec执行./script.sh这个程序,exec系统调用应该把子进程的代码段替换成./script.sh程序的代码段,并从它的_start开始执行。然而script.sh是个文本文件,根本没有代码段和_start函数,怎么办呢?其实exec还有另外一种机制,如果要执行的是一个文本文件,并且第一行用Shebang指定了解释器,则用解释器程序的代码段替换当前进程,并且从解释器的_start开始执行,而这个文本文件被当作命令行参数传给解释器。因此,执行上述脚本相当于执行程序
$ /bin/sh ./script.sh
以这种方式执行不需要script.s件具有可执行权限。再举个例子,比如某个sed脚本的文件名是script,它的开头是
#! /bin/sed -f
执行./script相当于执行程序
$ /bin/sed -f ./script.sh
以上介绍了两种执行Shell脚本的方法:
$ ./script.sh
$ sh ./script.sh
这两种方法本质上是一样的,执行上述脚本的步骤为:
图 31.1. Shell脚本的执行过程
$ ./script.sh
$ sh ./script.sh
这两种方法本质上是一样的,执行上述脚本的步骤为:
图 31.1. Shell脚本的执行过程
1. 交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止。
2. sh读取脚本中的cd ..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。
3. sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。
4. ls终止后,sh继续执行,读到脚本文件末尾,sh终止。
shell代码 5. sh终止后,bash继续执行,打印提示符等待用户输入。
如果将命令行下输入的命令用()括号括起来,那么也会fork出一个子Shell执行小括号中的命令,一行中可以输入由分号;隔开的多个命令,比如:
$ (cd ..;ls -l)
和上面两种方法执行Shell脚本的效果是相同的,cd ..命令改变的是子Shell的PWD,而不会影响到交互式Shell。然而命令
$ cd ..;ls -l
则有不同的效果,cd ..命令是直接在交互式Shell下执行的,改变交互式Shell的PWD,然而这种方式相当于这样执行Shell脚本:
$ source ./script.sh
或者
$ . ./script.sh
source或者.命令是Shell的内建命令,这种方式也不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。
和上面两种方法执行Shell脚本的效果是相同的,cd ..命令改变的是子Shell的PWD,而不会影响到交互式Shell。然而命令
$ cd ..;ls -l
则有不同的效果,cd ..命令是直接在交互式Shell下执行的,改变交互式Shell的PWD,然而这种方式相当于这样执行Shell脚本:
$ source ./script.sh
或者
$ . ./script.sh
source或者.命令是Shell的内建命令,这种方式也不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论