shell腳本中source和sh的區別


source script.sh 在當前環境下執行, 所有的變量即使腳本運行結束也會被保留下來(無需顯示的聲明),也可以使用當前bash中定義的變量.

在當前shell下定義一個變量

$var1='var1 defined in shell'

在腳本中輸出上面定義的變量, 然后再定義一個新的變量

$ cat << EOF > script.sh
> echo \$var1
> var2="VAR var2 defined in the script.sh"
> EOF

$ echo $var1

var2='VAR var2 defined in the script.sh'

$source script.sh
var1 defined in shell

腳本執行完以后再輸出var2, 可以看到var2已經定義, 並且輸出.

$ echo $var2

$ VAR var2 defined in the script.sh

sh script.sh 是在一個子進程中運行, 任何分配的變量會在腳本運行結束時釋放掉. 腳本中聲明的變量腳本運行結束后就不復存在.

Note: ./script2.sh 也等同於這種方式.

# 首先在當前shell中定義一個變量
$ var="va1 is defined"

$ cat << EOF \> script2.sh
> if [ -z \${var+x} ];then
>     echo "var id not set"
> else
>     echo "var is set to $var";
> fi
> var2="var2 defined in script.sh"
> EOF

$ chmod +x script2.sh 

[centos@localhost ~]$ sh script2.sh 
var id not set

[centos@localhost ~]$ echo $var2

輸出為空, 當前shell不能使用./script2.sh中定義的變量, 腳本中也不能使用shell中定義的變量.
Note: source script.sh與. scirpt.sh等價. sh 通常是bash的軟鏈接, 所以也是等價的.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM