`
scm002
  • 浏览: 318638 次
社区版块
存档分类
最新评论

在shell脚本中调用另一个脚本的三种不同方法

 
阅读更多
  • fork  ( /directory/script.sh)

fork是最普通的, 就是直接在脚本里面用/directory/script.sh来调用script.sh这个脚本.

运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

  • exec (exec /directory/script.sh)

exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本.  被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

  • source (source /directory/script.sh)

与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

 

可以通过下面这两个脚本来体会三种调用方式的不同:

1.sh 

#!/bin/bash
A=B
echo "PID for 1.sh before exec/source/fork:$$"
export A
echo "1.sh: \$A is $A"
case $1 in
        exec)
                echo "using exec…"
                exec ./2.sh ;;
        source)
                echo "using source…"
                . ./2.sh ;;
        *)
                echo "using fork by default…"
                ./2.sh ;;
esac
echo "PID for 1.sh after exec/source/fork:$$"
echo "1.sh: \$A is $A"

2.sh 

#!/bin/bash
echo "PID for 2.sh: $$"
echo "2.sh get \$A=$A from 1.sh"
A=C
export A
echo "2.sh: \$A is $A"

 

 

执行情况:

$ ./1.sh    
PID for 1.sh before exec/source/fork:5845364
1.sh: $A is B
using fork by default…
PID for 2.sh: 5242940
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5845364
1.sh: $A is B
$ ./1.sh exec
PID for 1.sh before exec/source/fork:5562668
1.sh: $A is B
using exec…
PID for 2.sh: 5562668
2.sh get $A=B from 1.sh
2.sh: $A is C
$ ./1.sh source
PID for 1.sh before exec/source/fork:5156894
1.sh: $A is B
using source…
PID for 2.sh: 5156894
2.sh get $A=B from 1.sh
2.sh: $A is C
PID for 1.sh after exec/source/fork:5156894
1.sh: $A is C
$

分享到:
评论

相关推荐

    android系统中调用shell脚本

    5. **使用AIDL(Android Interface Definition Language)**:创建一个服务,通过AIDL接口暴露调用shell脚本的功能,然后在客户端调用该服务。这种方式适用于跨进程通信。 6. **使用第三方库**:如`android.os....

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

    先来说一下主要以下有几种方式: fork: 如果脚本有执行权限的话,path/to/foo.sh。如果没有,sh path/to/...运行的时候 terminal 会新开一个子 Shell 执行脚本 foo.sh,子 Shell 执行的时候, 父 Shell 还在。子 Shell

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

    在Shell脚本编程中,有时我们需要在一个脚本中调用另一个脚本来实现功能的组合或扩展。本文将详细讲解在Shell脚本中调用其他Shell脚本的三种常见方法:`fork`、`exec`以及`source`,并提供实例以帮助理解它们的工作...

    使用shell调用php脚本

    当我们需要在Linux服务器上自动化执行一些PHP任务时,通过shell调用PHP脚本是一种常见且高效的方法。下面我们将详细探讨如何实现这一过程。 首先,确保你的Linux系统已经安装了PHP运行环境。你可以通过运行`php -v`...

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

    但在实际操作中,可能会遇到Unity无法正确调用shell脚本并传递参数的问题。本文将详细介绍如何解决这一问题,并提供一个具体的示例来帮助理解整个流程。 #### Unity 调用 Shell 脚本概述 在Unity中,可以通过`...

    shell 脚本调用Java类

    在IT领域,Shell脚本和...总结来说,Shell脚本调用Java类是系统集成和自动化的重要手段。理解如何在Shell环境中正确运行Java程序,以及如何在Shell脚本中控制Java程序的执行,是提高工作效率和系统灵活性的关键技能。

    Shell脚本中引用、调用另一个脚本文件的2种方法

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh  方法二: source ./subscript.sh 注意: 1.两个点之间,有空格,千万注意. 2.两个脚本不在同一目录,要用绝对路径 3.为...

    109个shell脚本合集.pdf

    Shell脚本是一种脚本语言,利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能。 Shell脚本可以直接使用在Windows、Unix、Linux上面,并且可以调用大量系统内部的功能来解释执行程序。如果...

    java调用shell(包含有参数的调用)

    总之,Java调用Shell脚本是一个有效的方法来在Java程序中实现复杂的Linux环境下的操作,这种技术尤其适用于需要进行系统级操作和自动化任务的场景。掌握这一技术可以帮助开发者更好地实现跨平台的功能,尤其是在开发...

    250个shell脚本

    Shell脚本是Linux/Unix操作系统中的强大工具,它允许用户编写一系列命令,形成自动化任务,以提高工作效率。本文档收集了250个实用的Shell脚本实例,涵盖了多个应用场景,包括系统管理、安全防护、数据库备份等核心...

    java调用shell脚本完美封装

    本文将详细介绍如何在Java中完美封装shell脚本的调用方法,并提供相关的测试示例。 1. **Java与Shell脚本的桥梁:Runtime类和ProcessBuilder类** Java提供了两种主要的方式来调用外部程序,包括Shell脚本:`...

    使用runtime实现linux命令行或shell脚本多次调用

    `Runtime.exec(String command)`方法用于执行单个命令,而如果需要执行包含多个命令的shell脚本,可以使用`Runtime.exec(String[] cmdArray)`,其中cmdArray是一个包含命令及其参数的字符串数组。 下面是一个简单的...

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

    本文将详细介绍三种Shell脚本调用其他脚本的方法,并探讨它们之间的区别及如何通过`export`命令使子进程能够访问父进程的变量。 1. **使用`source`命令或点号`.`** `source`命令和点号`.`是同义的,它们的作用是将...

    shell脚本调用python脚本,并传参

    本篇文章将详细介绍如何在`Shell`脚本中调用`Python`脚本并传递参数,以及如何应用这一技术来删除指定日期前的文件。 首先,我们来看如何在`Shell`中调用`Python`脚本。这通常通过`python`或`python3`命令来实现,...

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

    在 Android 系统中,我们可以启动一个服务,让这个服务去执行 shell 脚本。例如,我们可以在 init.rc 文件中添加以下代码: `service usblp_test /data/setip/init.usblpmod.sh oneshot disabled` 然后,在应用...

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

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

    java调用shell脚本

    Java作为一种跨平台的编程语言,提供了多种方式来调用Shell脚本,实现与操作系统的交互。本文将深入探讨Java如何调用Shell脚本以及相关的知识点。 首先,Java通过Runtime类或ProcessBuilder类可以执行外部程序,...

Global site tag (gtag.js) - Google Analytics