1. 程式人生 > >shell指令碼中呼叫另一個指令碼的三種不同方法

shell指令碼中呼叫另一個指令碼的三種不同方法

1、fork (fork /directory/script.sh)

fork是最普通的, 就是直接在腳本里面用/directory/script.sh來呼叫script.sh這個指令碼.
執行的時候開一個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。
sub-shell執行完畢後返回parent-shell. sub-shellparent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell

2、exec (exec /directory/script.sh)

exec與fork不同,不需要新開一個sub-shell來執行被呼叫的指令碼.  被呼叫的指令碼與父指令碼在同一個shell內執行。但是使用exec
呼叫一個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了。這是execsource的區別

3、source (source /directory/script.sh)

與fork的區別是不新開一個sub-shell來執行被呼叫的指令碼,而是在同一個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.

4、示例
a、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
"

b、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"

5、執行情況

$ ./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
$

相關推薦

shell指令碼呼叫一個指令碼不同方法

1、fork (fork /directory/script.sh) fork是最普通的, 就是直接在腳本里面用/directory/script.sh來呼叫script.sh這個指令碼. 執行的時候開一個sub-shell執行呼叫的指令碼,sub-she

shell指令碼呼叫一個指令碼不同方法(fork, exec, source)

fork fork(fork /directory/script.sh)如果shell中包含執行命令,那麼子命令並不影響父級的命令,在子命令執行完後再執行父級命令。子級的環境變數不會影響到父級。 fork是最普通的, 就是直接在腳本里面用/directory

shell指令碼呼叫一個指令碼不同方法(fork, exec, source)

fork ( /directory/script.sh) fork是最普通的, 就是直接在腳本里面用/directory/script.sh來呼叫script.sh這個指令碼. 執行的時候開一個sub-shell執行呼叫的指令碼,sub-shell執行的時候, pa

Shell 指令碼呼叫一個 Shell 指令碼方式

先來說一下主要以下有幾種方式: fork: 如果指令碼有執行許可權的話,path/to/foo.sh。如果沒有,sh path/to/foo.sh。 exec: exec path/to/foo.sh source: source path/to/foo.s

Shell 指令碼呼叫一個 Shell 指令碼方式以及返回值問題

指令碼呼叫: 先來說一下主要以下有幾種方式: fork: 如果指令碼有執行許可權的話,path/to/foo.sh。如果沒有,sh path/to/foo.sh。新開啟子shell,需要在父shell定義環境變數的變數子shell才可以使用可以繼承環境變數。在指令碼中

Linux shell指令碼呼叫一個shell(exec、source、fork)

        最近在研究yarn的原始碼,在看到YarnChild的啟動指令碼時,看到啟動的時候用到了shell中得exec命令,比較好奇為什麼使用exec,網上找了一下這個命令和類似命令的使用方法,原文地址:http://qujunorz.blog.51cto

Shell指令碼呼叫另外一個指令碼方法

       在Linux平臺上開發,經常會在console(控制檯)上執行另外一個指令碼檔案,經常用的方法有:./my.sh 或 source my.sh 或 . my.sh;這三種方法有什麼不同呢?我們先來了解一下在一個shell指令碼中如何呼叫另外一個shell指令

一個JSP頁面呼叫一個JSP方式

(1)include指令         include指令告訴容器:複製被包含檔案彙總的所有內容,再把它貼上到這個檔案中。 <%@ include file="Header.jsp"%> (2)include標準動作 <jsp:include page

SHELL一個指令碼如何引用一個指令碼定義的變數

建立一個 sh.config的指令碼 #PATH------------------------------------------------------------ bakFile=/ngbboss/mddms/inter/onlineto/bakfile logFil

Linux/Unix shell 指令碼呼叫SQL RMAN指令碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

python指令碼啟動一個python指令碼

         有時間,我們需要在一個python指令碼中調起另一個python指令碼,下面我嘗試了一下,          1.父指令碼如下: #coding:utf8 #!/usr/local/bin/python import time import datet

在python程式呼叫一個py檔案

在同一個資料夾下 呼叫函式: A.py檔案:     def add(x,y): print('和為:%d'%(x+y)) B.py檔案:     import A A.add

python檔案呼叫一個python檔案的類

如果是在同一個 module中(也就是同一個py 檔案裡),直接用就可以 如果在不同的module裡,例如 a.py裡有 class A: b.py 裡有 class B: 如果你要在class B裡用class A 需要在 b.py的開頭寫上 from a import A  

安卓的資料共享——從一個APP呼叫一個APP資料的方法

在Android中如何在一個APP中呼叫另一個APP中的資料呢?大致有以下五種方法可以實現 1、首選項資訊-Shared Preferences 2、檔案 3、SQLite 4、Content Provider 5、廣播 下來對上述的五種方法進行詳細的解析: 1、首先對

如何使用spring容器在一個呼叫一個類的方法

學了spring容器之後,最基本的就是這個在一個類中呼叫另一個類中的方法了。本文講述的就是如何使用spring容器從一個類呼叫另一個類的方法。首先,我們先新建一個Student類,在類中建立一個int型別的方法。如圖: 第一個類Student就完成了,那麼我們

python 在一個py檔案呼叫一個資料夾下py檔案模組

假設現在的資料夾結構如下: -- src     |-- dir1     |    -- file1.py     |-- dir2     | 

Spring 從同一個類的某個方法呼叫一個有註解(@Transactional)的方法時,失效的解決方案

考慮有下面這麼一個類 public class Foo { @Transactional public void bar() { /* … */ } public void

在同一個類呼叫一個方法沒有觸發 Spring AOP 的問題

起因 考慮如下一個例子: @Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyMonitor { } @Component @Aspect pub

js檔案呼叫一個js檔案的函式

假設條件是:JS(A)要呼叫JS(B)的函式.那麼要滿足以下條件:1.要保證你所呼叫的JS必須在同一個頁面裡. 也就是JS(A)和JS(B)都要在頁面X裡.2.要保證你所呼叫的JS先於呼叫者本身被解釋.也就是JS(B)要先於JS(A)被解釋.反映在頁面上,就是JS(B)要寫

python ,如何在一個函式呼叫一個函式返回的多個值一個

在一個函式中呼叫另一個函式返回的多個值中的一個 首先,定義了一個函式 。 程式碼如下: def createDataSet(): group = array([[1.0,1.1],[1