Linux shell脚本中调用另一个shell(exec、source、fork)

  在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh)、source(source script.sh)、fork(./script.sh)

exec(exec /home/script.sh):

使用exec来调用脚本相当于在当前shell执行了一条命令,不会产生新的进程,被执行的脚本会继承当前shell的环境变量。但是当exec调用完毕后,当前shell也会结束,剩下的代码不会执行。

source(source /home/script.sh)

使用source或者“.”来调用外部脚本,同样不会产生新的进程,与exec类似,继承当前shell环境变量,而且被调用的脚本运行结束后,它拥有的环境变量和声明变量会被当前shell保留。

fork(/home/script.sh)

直接运行脚本,会产生新的进程,并且继承主脚本的环境变量和声明变量。执行完毕后,主脚本不会保留其环境变量和声明变量。

主脚本:

 1 #!/bin/sh
  2 a=fork
  3 
  4 echo "a is $a"
  5 echo "PID for parent before 2.sh:$$"
  6 case $1 in
  7   exec)
  8     echo "using exec"
  9     exec ./2.sh ;;
 10   source)
 11     echo "using sourcing"
 12     source ./2.sh ;;
 13   *)
 14     echo "using fork"
 15     ./2.sh ;;
 16 
 17 esac
 18 
 19 echo "PID FOR parent after 2.sh :$$"
 20 
 21 echo "now main.sh a is $a"
 22 echo "$b"

调用脚本:2.sh

1 #!/bin/sh
  2 echo "PID FOR 2.SH:$$"
  3 
  4 echo  "2.sh get a from main.sh is $a"
  5 
  6 a=2.sh
  7 export a
  8 b=3.sh
  9 
 10 echo "now 2.sh a is $a"
~                                                                          
~

执行结果:

[[email protected] home]# ./main.sh exec
a is main
PID for parent before 2.sh:19026
using exec
PID FOR 2.SH:19026
2.sh get a from main.sh is main
now a is 2.sh

[[email protected] home]# ./main.sh source
a is main
PID for parent before 2.sh:19027
using sourcing
PID FOR 2.SH:19027
2.sh get a from main.sh is main
now a is 2.sh
PID FOR parent after 2.sh :19027
now main.sh a is 2.sh
3.sh

[[email protected] home]# ./main.sh fork
a is main
PID for parent before 2.sh:19028
using fork
PID FOR 2.SH:19029
2.sh get a from main.sh is main
now a is 2.sh
PID FOR parent after 2.sh :19028
now main.sh a is main

[[email protected] home]#

Linux shell脚本中调用另一个shell(exec、source、fork)

时间: 2024-10-03 14:00:52

Linux shell脚本中调用另一个shell(exec、source、fork)的相关文章

Shell 脚本中调用另一个 Shell 脚本的三种方式

主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell. exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行.   第一种:fork 特点:会生成子PID而且可重

Shell脚本中调用另外一个脚本的方法

在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork    exec    source. 1.fork  ( /directory/script.sh) : 如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令.子级的环境变量不会影响到父

shell脚本中执行另一个shell脚本

分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量 注意,圆点后面有个空格. 这样,在本shell脚本的后面部分就可以引用其他文件中声明的一些变量. 当再用这些变量去执行第3个脚本时,我不知是怎么回事,总是有些莫名其妙的错误,发现只有这个文件中不存在空行才行,哪怕只有一个注释符,都不会出错,就是不能有空行. 其实我想应该也不是这个问题,而是windows和linux处理

在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)——转载

原文链接:http://blog.chinaunix.net/uid-22548820-id-3181798.html fork ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令.在子命令执行完后再执行父级命令,子级的环境变量不会影响到父级. fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候,

在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

一.fork  ( /directory/script.sh) :如果shell中包含执行命令,那么子命令并不影响父级的命令,在子命令执行完后再执行父级命令.子级的环境变量不会影响到父级. fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本. 运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在. sub-shell执行完毕后返回parent-shell. sub-shell

Linux/Unix shell 脚本中调用SQL,RMAN脚本

Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例. 一.由shell脚本调用sql,rman脚本 [python] view plain copy print? 1.shell脚本调用sql脚本 #首先编辑sql文件 [email protecte

shell脚本中的函数,shell中的数组,shell项目-告警系统

shell脚本中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() {command }函数必须要放在最前面,function可以省略直接写函数名 示列1,打印shell的参数 [[email protected] shell]# cat fun1.sh #!/bin/bash function inp(){ echo "the first par is $1" echo

在shell脚本中调用sql语句

查询员工信息 -S:静默登录 [[email protected] shells]$ cat shell1.sh #!/bin/bash #查询员工信息 sqlplus -S /nolog <<EOF conn scott/scott set feedback off set linesize 300 set pagesize 100 col empno for 99999 col ename for a12 col mgr for 9999 col hiredate for a20 col

Linux shell脚本中如何读取跟shell脚本同一目录下的配置文件

配置文件如下 ##########BACKUP MYSQL CONFIG####### #database name db_name=test db_user=root db_pass=123456 #####backup day config begin ##### day_backupdir=/home/backup/db/day day_backup_fix=day day_interval=1 #####backup day config end ####### #####backup