exec source以及bash的區別

2021-06-26 14:09:15 字數 1569 閱讀 1199

from:

在bash shell中,source、exec以及sh都可以用來執行shell script,但是它們的差別在**呢?

sh:父程序會fork乙個子程序,shell script在子程序中執行

source:在原程序中執行,不會fork子程序

exec:在原程序中執行,但是同時會終止原程序

注:使用export會把父程序中的變數向子程序中繼承,但是反過來卻不行,在子程序中,不管環境如果改變,均不會影響父程序

下面用乙個例子來講解

[plain]view plain

copy

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"  

[plain]view plain

copy

2.sh  

code:  

#!/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 fork

可以看到,1.sh是在父程序中執行,2.sh是在子程序中執行的,父程序的pid是5344,而子程序的是5345,當子程序執行完畢後,控制權返回到父程序。同時,在子程序改變環境變數a的值不會影響到父程序。

./1.sh source

由結果可知,1.sh和2.sh都是在同一程序中執行的,pid為5367

./1.sh exec

可知,兩個指令碼都是在同一程序中執行,但是請注意,使用exec終止了原來的父程序,因此,可以看到

[plain]view plain

copy

echo "pid for 1.sh after exec/source/fork:$"  

echo "1.sh: \$a is $a"  

這兩個命令沒有執行

由這個例子,便大致可了解它們的區別了

exec source以及bash的區別

在bash shell中,source exec以及sh都可以用來執行shell script,但是它們的差別在 呢?sh 父程序會fork乙個子程序,shell script在子程序中執行 source 在原程序中執行,不會fork子程序 exec 在原程序中執行,但是同時會終止原程序 注 使用e...

ASIHttpRequest登入與Basic驗證

一 asihttprequest元件的新增在我的其他blog裡有介紹,這裡不予贅述。二 基本的request ibaction graburl id sender 二 帶basic驗證的request 新增 1 設定request模式為basic,request 2 新增username和passw...

在Windows上VSCode執行Bash終端

可能windows開發的乙個缺點就是與shell結合的不好,git bash提供了一種方式可以在windows下執行linux命令,如何將其結合在vscode中使用呢?兩種方式 1.將git bash目錄比如c program files x86 git bin bash.exe新增到環境變數中,就...