淺析shell中source命令和.逗號命令對當前父shell的影響

 

lu1() {
    echo 'aaaaaaaaa'
}

lu2() {
    echo 'bbbbbbbbb'
}
上面就是,run.sh的源碼了,可以看到只有2個函數定義沒有任何地方來調用這兩個函數,那麼我們如果這樣執行:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$
可以看到什麼都沒有,因爲沒有地方調用這2個函數,我們希望在我們的luther@gliethttp:~$ 提示符後面調用這2個函數,來試試,
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$
結果都提示找不到命令,是不是我們的這個需求shell還不提供支持呢,當然不是,這樣有用的需求shell早就爲我們做好解決方案了,來看看怎麼實現,
shell中有2個命令可以完成我們的工作,一個是source另一個就是和source等效的.逗號運算符:
luther@gliethttp:~$ . run.sh或者luther@gliethttp:~$source run.sh
這樣我們run.sh腳本中創建的變量和函數就添加到了執行.或source的shell,直到關閉該shell窗口,否則run.sh中創建的變量和函數將一直有效,
如果我們只是執行./run.sh啓動一個subshell來運行我們的run.sh腳本,那麼run.sh腳本中的變量和函數將緊緊影響到由shell啓動的subshell,當./run.sh腳本退出之後,run.sh變量和函數的影響壽命也到了盡頭。
來看看現在的現象:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$ . run.sh
luther@gliethttp:~$ lu1
aaaaaaaaa
luther@gliethttp:~$ lu2
bbbbbbbbb
luther@gliethttp:~$
重新啓動一個新shell:
luther@gliethttp:~$ ./run.sh
luther@gliethttp:~$ lu1
bash: lu1: command not found
luther@gliethttp:~$ lu2
bash: lu2: command not found
luther@gliethttp:~$ source run.sh
luther@gliethttp:~$ lu1
aaaaaaaaa
luther@gliethttp:~$ lu2
bbbbbbbbb
luther@gliethttp:~$

發佈了16 篇原創文章 · 獲贊 0 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章