[shell] shell 變量生命周期, source, export


1. shell 的派生

用戶登錄到Linux系統后,系統將啟動一個用戶shell。在這個shell中,可以使用shell命令, 或聲明變量,也可以創建並運行shell腳本程序。運行shell腳本程序時,系統將創建一個子shell。

此時,系統中將有兩個shell,一個是登錄時系統啟動的shell,另一個是系統為運行腳本程序創建的shell。當一個腳本程序運行完畢,腳本shell將終止,返回到執行該腳本之前的shell。

從這種意義上來說,用戶可以有許多 shell,每個shell都是由某個shell(稱為父shell)派生的。

2. shell中變量的生存周期

生命周期在子shell中定義的變量只在該子shell內有效。如果在一個shell腳本程序中定義了一個變量,當該腳本程序運行時,這個定義的變量只是該腳本程序內的一個局部變量,其他的shell不能引用它。

執行一個腳本時,會先開啟一個子shell環境, 將父shell中的所有系統環境變量復制過來,這個腳本中的語句就在子shell中執行。父shell的環境變量在子shell中可以調用,但反過來就不行,如果在子shell中定義了環境變量,只對該shell或者它的子shell有效,當該子shell結束時,也可以理解為腳本執行完時,變量消失。

export: 要使某個變量的值可以在其他shell中被改變,可以使用export命令對已定義的變量進行輸出。export命令將使系統在創建每一個新的shell時,定義這個變量的一個拷貝。這個過程稱之為變量輸出

3. sh, source 與 export

(1) sh於source的區別:直接執行一個腳本文件是在一個子shell中運行的,而source則是在當前shell環境中運行的。

(2) export的作用相當於將本來只作用於該shell的變量設置為系統變量。

腳本中如果只定義了變量未export, 則該變量仍只對該shell有效。 如果用source對腳本進行執行時,如果不加export,就不會在子shell中看到這個變量,因為它還不是一個系統環境變量,如腳本test.sh內容是:

test='value'

直接source執行后,在shell下是能看到這個變量。(sh執行看不到哦~)

但再執行bash開一個子shell時,在test.sh中定義的變量是不會被復制到子shell中的,因為執行腳本文件其實也是在一個子shell中運行,所以我再建另一個腳本文件執行時,是不會輸入任何東西的,內容如:echo $test。所以這點特別注意了,明明在提示符下可以用echo $test輸出變量值,為什么把它放進腳本文件就不行了。

4. 示例:

1.sh的作用

腳本文件1:sh1.sh

執行:
# sh sh1.sh
# echo $v
# (無輸出)

原因:因為執行腳本文件是在當前shell的一個子shell中進行的,所以執行完畢后,回到當前shell進行echo是看不到子shell中變量值的。

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

腳本文件2:sh2.sh

執行:
# sh sh1.sh
# value
# bash
$ echo $v
$ (無輸出)

原因:

當前shell進行 sh sh1.sh 后開了一個執行腳本文件的子shell,暫且稱為shell1。sh sh1.sh可以輸出值是因為那個echo是寫在腳本文件中的,也就是該命令的執行是在執行腳本的shell中進行的,可以看到自己所在shell,也就是shell1的變量值。

再bash新開一個shell之后,是當前shell的子shell,暫且稱為shell2。shell1, shell2都是當前shell的子shell,互相看不到對方變量信息。

注意:上面兩個echo作用的shell是不同的!!! 腳本文件中的echo作用於 shell1;在命令行的echo作用於當前shell。shell1是當前shell的子shell.

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

2. source的作用

還是用上面的腳本文件sh1.sh於sh2.sh

腳本文件1:sh1.sh

執行:
# source sh1.sh
# echo $v
# value
# bash
$ echo $v
$ value

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

腳本文件1:sh2.sh

執行:
# source sh2.sh
# value
# echo $v
# value
# bash
$ echo $v
$ value
可以看到該變量作用在了當前環境,而非僅執行sh腳本文件的shell。

 參考:https://www.cnblogs.com/zhangze/articles/1832542.html


免責聲明!

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



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