1. 程式人生 > >Linux shell指令碼中呼叫另一個shell(exec、source、fork)

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

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

=========================================================================================================

在執行shell指令碼時候,有三種方式來呼叫外部的指令碼,exec(exec script.sh)、source(source script.sh)、fork(./script.sh)
1、exec(exec /home/script.sh):

    使用exec來呼叫指令碼,被執行的指令碼會繼承當前shell的環境變數。但事實上exec產生了新的程序,他會把主shell的程序資源佔用並替換指令碼內容,繼承了原主shell的PID號,即原主shell剩下的內容不會執行。

2、source(source /home/script.sh)

    使用source或者“.”來呼叫外部指令碼,不會產生新的程序,繼承當前shell環境變數,而且被呼叫的指令碼執行結束後,它擁有的環境變數和宣告變數會被當前shell保留,類似將呼叫指令碼的內容複製過來直接執行。執行完畢後原主shell繼續執行。

3、fork(/home/script.sh)

   直接執行指令碼,會以當前shell為父程序,產生新的程序,並且繼承主指令碼的環境變數和宣告變數。執行完畢後,主指令碼不會保留其環境變數和宣告變數。

總結:這樣來看fork最靈活,source次之,exec最詭異。

主指令碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/sh 2 a=main
echo "a is $a" echo "PID for parent before 2.sh:$$" 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

相關推薦

Linux shell指令碼呼叫一個shell(execsourcefork)

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

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才可以使用可以繼承環境變數。在指令碼中

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指令碼呼叫另外一個指令碼的方法

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

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

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

9Shell指令碼呼叫其他指令碼

在Shell指令碼的執行過程中,Shell指令碼支援呼叫另一個Shell指令碼,呼叫的格式為:程式名 例項:在Shell指令碼test1中呼叫test2。 #!/bin/bash   echo "The main name is $0"; ./test2; echo "The first string

在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 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指令碼啟動一個python指令碼

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

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

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

C++學習筆記-----在一個建構函式呼叫一個建構函式

在建構函式中呼叫另一個建構函式如果一不注意就會有無限遞迴的危險,而且建構函式的引數的不同也決定了呼叫的不同,所以特意總結了一下哪些形式的呼叫時允許的: 首先假設建構函式呼叫時引數都是外部的變數,而不是一個常量。 第一種,也是C++11支援的一種呼叫方式。在函式的初始化列表中

Java一個方法呼叫一個方法

在同一個類中: 對於靜態方法,其他的靜態或非靜態方法都可以直接呼叫它。 而對於非靜態方法,其他的非靜態方法是可以直接呼叫它的。但是其他靜態方法只有通過物件才能呼叫它。 靜態方法不能被非靜態方法覆蓋。 public class Test2 { public static v