- 论坛徽章:
- 0
|
一个百思不得其解的函数引用问题
十三问有关此问题的出处是这样写的:
因為,一般我們跑的 shell script 是用 subshell 去執行的。
從 process 的觀念來看,是 parent process 產生一個 child process 去執行,
當 child 結束後,會返回 parent ,但 parent 的環境是不會因 child 的改變而改變的。
所謂的環境元數很多,凡舉 effective id, variable, workding dir 等等...
其中的 workding dir ($PWD) 正是樓主的疑問所在:
當用 subshell 來跑 script 的話,sub shell 的 $PWD 會因為 cd 而變更,
但當返回 primary shell 時,$PWD 是不會變更的。
能夠了解問題的原因及其原理是很好的,但是?如何解決問題恐怕是我們更感興趣的﹗是吧?^_^
那好,接下來,再讓我們了解一下 source 命令好了。
當你有了 fork 的概念之後,要理解 source 就不難:
* 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
由於所有執行結果均於當前 shell 內完成,若 script 的環境有所改變,當然也會改變當前環境了﹗
因此,只要我們要將原本單獨輸入的 script 命令行變成 source 命令的參數,就可輕易解決前例提到的問題了。
比方說,原本我們是如此執行 script 的:
代码:
./my.script
現在改成這樣即可:
代码:
source ./my.script
或:
. ./my.script
反复咬文嚼字,关键也就是这一段了
* 所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行
也就是说用sh function.sh的方式运行的是子程序,运行完毕以后所有的环境参数变量都不会影响父程序的,用. function.sh的方式则会影响。所以如果要在你程序中引用函数,必须把函数主体引入,而不是执行完毕就把这个函数扔掉,所以应该用. function.sh |
|