shell脚本的执行方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

shell脚本的执⾏⽅式运⾏shell脚本的五种⽅式
先来看⼀个简单的shell脚本:
1 2 3#!/bin/sh
cd/tmp echo"hello,world!"
我们来挨个解释⼀下脚本的每⼀⾏:
第⼀⾏:#!后⾯跟的是解释器的路径(shell本⾝就是⼀种解释型语⾔),解释器的路径是/bin/sh;
第⼆⾏:cd命令是切换当前⼯作⽬录的命令,tep是linux下根⽬录的⼀个⼦⽬录;
第三⾏:echo命令是输出后⾯所跟的参数
三种执⾏⽅法:
第⼀种:因为shell程序写完之后并没有执⾏权限,所以该脚本想要执⾏可以使⽤chmod命令赋予该脚本可执⾏的权限,然后再执⾏。

1 2 3 4 5 6 7 8[root@localhost shell]# chmod +x echo.sh [root@localhost shell]# ./echo,sh bash: ./echo,sh: 没有那个⽂件或⽬录[root@localhost shell]# ./echo.sh hello,world!
[root@localhost shell]# pwd
/root/shell
[root@localhost shell]#
第⼆种:调⽤解释器使得脚本执⾏,例如:bash、csh、csh、ash、bsh、ksh等等;
1 2 3 4[root@localhost shell]# sh echo.sh
hello,world!
[root@localhost shell]# bash echo.sh
hello,world!<br>[root@localhost shell]# pwd<br><em id="__mceDel">/root/shell</em>
第三种:使⽤source命令;
3、source(source /home/script.sh)依赖且影响变量,不影响主脚本执⾏
使⽤source或者“.”来调⽤外部脚本,不会产⽣新的进程,继承当前shell环境变量,
⽽且被调⽤的脚本运⾏结束后,它拥有的环境变量和声明变量会被当前shell保留,类似将调⽤脚本的内容复制过来直接执⾏。

执⾏完毕后原主shell继续运⾏。

1 2 3 4 5 6root@localhost shell]# source echo.sh hello,world!
[root@localhost tmp]# pdw
bash: pdw: command not found [root@localhost tmp]# pwd
/tmp
在脚本的第⼀⾏有cd命令,这是⼀个改变⼯作⽬录的命令,可是使⽤第⼀种和第⼆种放⼤执⾏脚本后当前的⼯作⽬录并没有改变(脚本所在的⽬录是shell⽂件夹,脚本执⾏后,使⽤pwd命令显⽰出当前的⼯作⽬录还是shell),使⽤第三种⽅法执⾏后当前的⼯作⽬录就改变了,进⼊了tmp中。

出现这种情况是系统本⾝执⾏脚本的⽅式不同所造成的!
前两种⽅法执⾏脚本时系统会创建⼀个⼦进程或者说⼦shell来执⾏脚本,原来的进程就是⽗进程或者说⽗shell,整个过程中⽗进程会等待⼦进程执⾏完毕,然后⼦进程退出,⽗进程也退出。

cd命令确实被执⾏了,但是仅仅是在⼦进程中改变了⼯作⽬录,所以脚本执⾏完后使⽤pwd显⽰⼯作⽬录并没有改变。

⽽第三种⽅法执⾏的shell脚本的话并不创建⼦进程,就是在原来的进程中执⾏,所以最后的⼯作⽬录改变了。

4、exec(exec /home/script.sh):依赖且独⽴影响主脚本执⾏
使⽤exec来调⽤脚本,被执⾏的脚本会继承当前shell的环境变量。

但事实上exec产⽣了新的进程,他会把主shell的进程资源占⽤并替换脚本内容,继承了原主shell的PID号,
即原主shell剩下的内容不会执⾏。

5、fork(/home/script.sh)依赖但不影响变量
直接运⾏脚本,会以当前shell为⽗进程,产⽣新的进程,并且继承主脚本的环境变量和声明变量。

执⾏完毕后,主脚本不会保留其环境变量和声明变量。

相关文档
最新文档