博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本的执行方式
阅读量:7090 次
发布时间:2019-06-28

本文共 1768 字,大约阅读时间需要 5 分钟。

运行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
6
root@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为父进程,产生新的进程,并且继承主脚本的环境变量和声明变量。

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

转载于:https://www.cnblogs.com/zyy98877/p/10218961.html

你可能感兴趣的文章
captive portal
查看>>
mysql基本数据类型(mysql学习笔记三)
查看>>
Laravel踩坑笔记——illuminate/html被抛弃
查看>>
飞秋命令行
查看>>
[转]python-元类
查看>>
复习日记-Listener/filter/servlet3.0/动态代理
查看>>
计算机基础——指令与程序
查看>>
Android Studio -- 关联源码
查看>>
leetcode Majority Element
查看>>
去除sql的前后半角全角空格
查看>>
关系型数据库之MySQL
查看>>
算法笔记-二叉树
查看>>
编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,并输出计算结果总是100的所有可能性。...
查看>>
Java异常处理课后作业
查看>>
redis 系列12 哈希对象
查看>>
企业搜索引擎开发之连接器connector(二十四)
查看>>
HDU 4902 Nice boat(线段树)
查看>>
Hadoop集群WordCount运行详解(转)
查看>>
[转]SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
查看>>
Linux--多网卡的7种Bond模式
查看>>