Shell Script運行方式的差異
source, sh script, ./script
不同的script運行方式還造成不一樣的結果!尤其對bash的環境影響很大。通常來說,shell腳本有一下幾種運行方式:
- 利用直接運行的方式運行script
- 利用source來運行腳本
- 利用. 小數點的方式來運行腳本
直接運行script
當使用直接命令運行(不論是絕對路徑/相對路徑還是$PATH內),或者是利用bash(或sh)來運行腳本時,該script都會使用一個新的bash環境來運行腳本內的命令!
也就是說,使用這種運行方式時,其實script實在子程序的bash內運行的!【當子程序完成後,在子程序內的各項變量或動作將會結束而不會傳回父程序中】
以下面的腳本為例:
#!/bin/bash # Program: # User inputs his first name and last name. Program shows his full name. #History: # 2018/10/6 keith First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Please input your first name:" firstname #提示輸入 read -p "Please input your last name:" lastname #輸入 echo -e "\nYour fullname is:$firstname $lastname" #打印到屏幕
這個交互式腳本可以讓使用者自行配置兩個變量,分別是firstname和lastname,如果直接運行該命令時,會發現script中幫你配置的firstname變量和lastname變量在bash中並沒有返回值,是不存在的。而這兩個變量在script運行中卻是有效的!也就是說,這兩個變量在父程序的bash中並不存在!
事實上,當我們使用直接運行的方式來處理腳本時,系統會給我們一個新的bash讓我們運行sh02.sh裏面的命令,因此sh02.sh中的firstname和lastname等變量其實實在子程序中的bash內運行的。當sh02.sh運行完後,子程序的bash中的所有數據會被移除,因此我們在父程序的bash下echo $firstname 時,就看不到任何返回值了。
利用source來運行腳本:在父程序中運行
如果使用source來運行腳本,我們再在父程序的bash中echo $firstname 發現,在腳本中的變臉firstname和lastname 有返回值了!
這是因為source對script的運行會在父程序中運行,因此各項動作都會在原本的bash內生效! 這也是為什麽你在更改玩 .bashrc 的配置後不必註銷系統,只需source ~/.bashrc 就會生效的原因!
Shell Script運行方式的差異