`
nanjingjiangbiao_T
  • 浏览: 2573465 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

执行shell脚本的三种不同情况

 
阅读更多

shell 脚本执行是一个很有意思的事情,有三种不同的基本情况。这也是linux系统灵活性的一种体现。在我开始做LFS之前,我只会做一种shell脚本的执行 方式。那就是在当前目录下 ./shell-script.sh。哈哈,最近看了一些文章的解释之后,发现我真是太土了。

以前看过一些linux programming的书,知道fork的概念。fork是一种主要的linux创建子进程的方式。fork被调用之后,会创建一个子进程,该子进程继承了父进程的环境变量,但是它只是父进程的拷贝,它的修改并不会影响父进程的环境变量。

我最早会用的./shell-script.sh其实就是fork的方式去运行一个程序(这个程序就是shell脚本)。所以这个新的shell脚本在运行时拥有父进程的一个环境变量表的拷贝。所以我们知道了,这种默认的shell脚本执行是会创建出新的进程的。

而另外还有两种用法,是不会创建出子进程的,那就是source和exec。
和fork方式不同,source和exec则都会在当前的进程内去执行相应的程序。所以就不存在环境变量的拷贝问题,该shell脚本的执行直接会影响 到当前的环境变量表。而且exec还有个特别之处就是,当它执行的程序完成之后,所在的进程也会退出。比如在Gnome的terminal中用exec command之后,当前的terminal就会退出,这个有时候还很有用。source还有一个很有趣的缩写,也就是一个点。比如. ./shell-script.sh,是不是很奇怪。

总结一下

New Process Terminate Current/Parent

-------------------------------------------------------

fork Y N

source N N

exec N Y

假设脚本为a.sh,则要运行该脚本,有以下方式

1 给脚本加上执行权限chmod u+x a.sh, 而后就可以直接用全路径来执行脚本了,比如当前文件夹下用./a.sh, 如果脚本所在目录在PATH环境变量之中, 则直接用a.sh即可

2 sh/bash a.sh的路径,这种情况不需要脚本具有执行权限.

以上两种情况中,脚本中$0都是a.sh,都是在shell的子进程中运行的.

3 source a.sh的路径

4 . a.sh的路径

以上两种情况都是脚本在当前shell的进程中运行,所以$0都是bash/sh, 区别在于, source不是posix shell的内置命令,所以3在sh中实际上是不能运行的,在bash中可以. 而.则无论在bash还是posix shell中都是可以用来载入并执行脚本. 所以, 相对而言, 应该是4 更加具有移植性.

有个脚本内容如下:

#!/bin/sh

export aaa="bbb"


运行方法:

1, sh jiaoben.sh

2, ./jiaoben.sh

3, . jiaoben.sh

解释:

1, 操作系统启动程序sh, sh发现了一个参数jiaoben.sh,并把文件jiaoben.sh作为脚本执行.

2, 操作系统启动这个程序,然后发现是个脚本而不是二进制的程序,然后又发现这个脚本要用/bin/sh 执行(通过#!发现的),然后操作系统交给/bin/sh执行下面的命令行.

3, 在当前环境下执行脚本.所有的环境变量的修改都会在当前环境下生效,而1,2,脚本退出后,环境变量不变.

分享到:
评论

相关推荐

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    IDEA中编写并运行shell脚本的实现

    主要介绍了IDEA中编写并运行shell脚本的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Shell脚本中获取进程ID的方法

    当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为“批处理进程”)。 在某些情况下,你也许想要知道运行中的子shell的PID。这个PID...

    如何让Android系统或Android应用执行shell脚本

    让Android系统或Android应用执行shell脚本,方法一是:通过修改/system/init/init.c,在里面写入执行脚本的命令。方法二是:启动一个服务,让这个服务去执行脚本。

    输出执行操作和打印日志的shell脚本实例

    cat /mnt/log_function.sh #!/bin/bash #log function ####log_correct函数打印正确的输出到日志文件 function log_correct () { DATE=`date “+%Y-%m-%d %H:%M:%S”` ####显示打印日志的时间...log_error打印shell脚本

    250个shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...

    一种限制shell脚本并行执行的方法

    本发明公开了一种限制shell 脚本并行执行 的方法,应用于linux 和unix 平台,包括:当有 shell 脚本需要执行时,脚本模块处理器向管道 写入请求;令牌模块处理器在管道另一端顺序读 取所述请求,当有令牌空闲时,将...

    android系统中调用shell脚本

    网上看了好多android下调用脚本的例子,在没有root的情况下,大多只能执行一些简单的脚本命令,经验证,总结出一种还算比较有用的方法,可以较多数脚本,算是比较靠谱,共享下

    hbase-shell批量命令执行脚本的方法

    批量执行hbase shell 命令 #!/bin/bash source /etc/profile ...以上这篇hbase-shell批量命令执行脚本的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    shell执行mysql脚本

    在shell脚本中向SQL文件传递参数,并且在shell脚本中执行SQL文件。

    Linux shell脚本.rar

    文件包含大作业shell脚本(快速备份系统)源码,实验课做的Linux实验shell脚本:Samba实验,DDNS(DHCP服务器 和DNS服务器的配置)的shell脚本,运行脚本每个实验只需要两三分钟即可完成。 其中sy1为实验一脚本,sy2...

    让shell脚本在后台执行

    使用shell脚本管理系统,可将脚本放在后台执行,同时非挂起运行。

    shell脚本不能执行问题

    shell脚本不能执行问题

    Shell脚本专家指南

    《Shell脚本专家指南》旨在为Linux、Unix以及OSx系统管理员提供短小精悍且功能强大的shell实现解决方案,教会读者如何使用现有调试器调试shell脚本。全书分为3个部分:脚本技术基础、系统交互和高级技术、有用的脚本...

    java调用shell脚本执行sqlldr与存储过程

    在linux环境中,这三个用户都可以直接在任意目录下执行该shell脚本,可是在java代码中调用shell脚本时,报了如下4个错误: 1、sqlldr: command not found 2、sqlplus: command not found 3、0750: You may need to ...

    linux shell脚本控制运行jenkins job.sh,用到curl请求运行job,jq处理json,shell脚本

    shell脚本自动化运行job,运维,测试,开发作持续集成

    Linux通过Shell脚本命令修改密码的两种方式

    1. ssh 远程到主机;...很多时候我们可能需要远程执行服务器上的脚本来修改账号密码,此时就没有办法进行交互了。 此时可以使用如下两种方式修改密码: 方式1: echo password | passwd testuser --stdin > /dev

    解决Unity不能调用shell脚本传递参数的问题

    解决Unity不能调用shell脚本传递参数的问题

    通过shell脚本执行scp和ssh命令

    通过shell脚本执行scp和ssh命令

    linux下shell脚本实现数据的导出

    第一次接触linux系统,之前写的数据导出不好使了。...找了好多资料,最后决定写个shell脚本;没接触过shell脚本,网上大部分例子都写的挺复杂的;贴个简单的,不带传参什么的;只是最简单的数据表的导出备份

Global site tag (gtag.js) - Google Analytics