2,494 瀏覽數

Bash Shell Script – source script, sh script, ./script

測試環境為 Ubuntu 16.04 x64

用下面的 script 來觀察 source script, sh script, ./script 執行後各項變數是否保留.

root@ubuntu:~# cat bash.sh 
#!/bin/bash
read -p "Please input your name:" name
echo -e "Your name is ${name}"
root@ubuntu:~# chmod a+x bash.sh 

sh script 與 ./script

我開了兩個 SSH 連線,一個用來執行程式,一個用來觀察程序的變化.

一開始先檢查程序的狀況.

root@ubuntu:~# pstree 
├─sshd─┬─2*[sshd───sshd───bash───sudo───su───bash]
        │      └─sshd───sshd───bash───sudo───su───bash───pstree
root@ubuntu:~# ./bash.sh 
Please input your name:Ben
Your name is Ben
root@ubuntu:~# echo ${name}

在剛剛的 script 還未輸入使用者名稱前就執行 pstress 來觀察程序的變化.可以看到 ./script 是一個新的子程序,並不會把參數 name 回傳給父程序.

root@ubuntu:~# pstree 
├─sshd─┬─sshd───sshd───bash───sudo───su───bash
        │      ├─sshd───sshd───bash───sudo───su───bash───pstree
        │      └─sshd───sshd───bash───sudo───su───bash───bash.sh

sh script 與 ./script 一樣當子程序完成後,在子程序內設定的變數都會在 scipt 一同結束,而不會傳回到父程序.

root@ubuntu:~# sh bash.sh
Please input your name:Ben
-e Your name is Ben
root@ubuntu:~# echo ${name}

root@ubuntu:~# pstree 
├─sshd─┬─sshd───sshd───bash───sudo───su───bash
        │      ├─sshd───sshd───bash───sudo───su───bash───pstree
        │      └─sshd───sshd───bash───sudo───su───bash───sh

source script

使用 source 來執行 script.

root@ubuntu:~# source bash.sh
Please input your name:Ben
Your name is Ben
root@ubuntu:~# echo ${name}
Ben

可以看到系統並沒有產生新程序,所以執行後的 參數被保留下來了.

root@ubuntu:~# pstree 
├─sshd─┬─2*[sshd───sshd───bash───sudo───su───bash]
        │      └─sshd───sshd───bash───sudo───su───bash───pstree

發表迴響