一、source命令是什么
source命令是Bash Shell內(nèi)置命令,其作用是在當(dāng)前Shell環(huán)境下讀取和執(zhí)行指定的Shell腳本文件。
很多Shell腳本都是以“#! /bin/bash”開頭的,這句話表明當(dāng)調(diào)用這個(gè)腳本時(shí),會在當(dāng)前Shell環(huán)境下調(diào)用/bin/bash解釋器。但是,如果不使用source命令來執(zhí)行Shell腳本,那么這個(gè)腳本的執(zhí)行環(huán)境將會在新的子Shell中創(chuàng)建,這與當(dāng)前Shell環(huán)境是相互獨(dú)立的。
使用source命令來執(zhí)行Shell腳本,可以讓腳本中定義的所有變量和函數(shù)都在當(dāng)前Shell環(huán)境中生效,從而避免了很多不必要的問題。
二、source命令的語法和選項(xiàng)
source命令的語法如下:
source filename [arguments]
. filename [arguments]
其中,filename指定要執(zhí)行的Shell腳本文件的路徑;arguments是可選的輸入?yún)?shù)。
在實(shí)踐中,source命令常常與“.”(點(diǎn)號)等價(jià)使用,例如“. ./myscript.sh”與“source ./myscript.sh”是等價(jià)的。
三、source命令的用法
1. 使用source命令加載環(huán)境變量和函數(shù)
使用source命令加載環(huán)境變量和函數(shù)是source命令的一種常見用法。通過將常用的環(huán)境變量和函數(shù)定義在一個(gè)文件中,然后使用source命令在每次Shell啟動(dòng)時(shí)都執(zhí)行這個(gè)文件,可以避免多個(gè)Shell環(huán)境之間的變量和函數(shù)定義不同步的問題。
例如,在用戶的主目錄下創(chuàng)建一個(gè)名為.bashrc的文件,并在其中定義幾個(gè)常用的環(huán)境變量和函數(shù):
$ echo "export MYVAR=123" > ~/.bashrc
$ echo "myfunction() { echo Hello World; }" >> ~/.bashrc
然后使用source命令加載這個(gè)文件:
$ source ~/.bashrc
$ echo $MYVAR
123
$ myfunction
Hello World
現(xiàn)在,MYVAR變量和myfunction函數(shù)就可以在當(dāng)前Shell環(huán)境中使用了。注意,這里使用了export命令來導(dǎo)出MYVAR變量,以便它能夠在當(dāng)前Shell環(huán)境中生效。
2. 使用source命令執(zhí)行腳本與傳遞參數(shù)
source命令還可以用來執(zhí)行腳本文件并傳遞參數(shù)。這種用法與在命令行中直接執(zhí)行Shell腳本的效果是一樣的,但是能保證腳本中定義的變量和函數(shù)在當(dāng)前Shell環(huán)境中生效。
例如,在當(dāng)前目錄下創(chuàng)建一個(gè)名為myscript.sh的Shell腳本,并在其中定義兩個(gè)變量和一個(gè)函數(shù):
$ echo "VAR1=hello" > myscript.sh
$ echo "VAR2=world" >> myscript.sh
$ echo "myfunc() { echo \"\$VAR1 \$VAR2\"; }" >> myscript.sh
然后使用source命令執(zhí)行這個(gè)腳本,并傳遞一個(gè)參數(shù):
$ source ./myscript.sh arg1
$ echo $VAR1
hello
$ echo $VAR2
world
$ myfunc
hello world
注意,在腳本中定義的變量和函數(shù)現(xiàn)在都在當(dāng)前Shell環(huán)境中生效。
四、source命令的小結(jié)
正如我們所看到的,source命令不僅可以用來加載環(huán)境變量和函數(shù),還可以用來執(zhí)行腳本文件并傳遞參數(shù)。使用source命令的好處是,它可以確保所有的變量定義和函數(shù)都在當(dāng)前Shell環(huán)境中生效,從而避免了與不同子Shell環(huán)境之間的變量同步問題。
在實(shí)踐中,我們應(yīng)該把常用的環(huán)境變量和函數(shù)定義在一個(gè)文件中,然后通過source命令在每次Shell啟動(dòng)時(shí)都執(zhí)行這個(gè)文件。這樣,就可以保證不同的Shell環(huán)境之間變量和函數(shù)的定義是同步的。