shell-腳本的執行
阿新 • • 發佈:2019-03-21
最大 結束 聯網 使用 好用 測試 linux source oldboy #1. shell-腳本的執行
- 當shell腳本以非交互的方式運行時,它會先查找環境變量ENV,該變量指定了一個環境文件(通常是.bashrc),然後從該環境變量文件開始執行,當讀取了ENV文件後,shell才開始執行shell腳本中的內容。
- shell腳本的執行通常可以采用以下三種方式:
- Bash script-name 或sh script-name (推薦使用)
- Path/script-name 或./script-name (當前路徑下執行腳本)
- Source script-name 或 .script-name #註意“.”點號。
- 執行說明
- 第一種方法是當腳本文件本身沒有可執行權限(即文件X位為-號)時常使用的方法,這裏推薦用bash執行,或者文件開頭沒有指定解釋器
- 第二種方法需要先將腳本文件的權限改為可執行(即文件加X位),具體方法:chmod u+x script-name 或 chmod 755 script-name 。然後通過腳本路徑就可以直接執行腳本了。
- 第三種方法通常是使用 source或者“,”點號讀入或加載指定的shelll腳本文件(san.sh),然後,依次執行指定shell腳本文件san.sh中的所有語句。這些語句將作為父shell腳本father.sh進程的一部分運行。因此,使用source或者“.”點號可以將san.sh自身腳本中的變量的值或函數等的返回值傳遞到當前的父shell腳本father.sh中使用。這是第三種方法和前兩種方法的最大區別,也是值得讀者註意的地方。
- source或者“."點號命令的功能是在當前shell中執行source或者“.”點號加載並執行的相關腳本文件中的命令及語句,而不是產生一個子shell來執行命令文件中的命令。
#2.下面我們舉例說明:
##2.1 使用第一種方法
[root@yanwei-test1 scripts]# cat test.sh
echo ‘I am oldboy‘
輸入“echo ‘I am oldboy”內容後按回車,然後在按ctrl+d組合建即可結束編程。此操作作為特殊編輯方法,作為cat用法的擴展知識提及(老男孩PS:在使用中去記憶是個好習慣)
[root@yanwei-test1 scripts]# cat test.sh
[root@yanwei-test1 scripts]# sh test.sh #使用第一種方式的sh命令執行test.sh腳本文件
I am oldboy
[root@yanwei-test1 scripts]# bash test.sh #使用第一種方式的sh命令執行test.sh腳本文件
I am oldboy
我們使用第一種方法,發現均可以執行並得到了預期的結果。
##2.2 使用第二種方法
[root@yanwei-test1 scripts]# ./test.sh #使用第二種方式“./”在當前目錄下執行test.sh腳本文件,細心的讀者可以發現,這個地方無法自動補全。
-bash: ./test.sh: 權限不夠 #提示:權限拒絕,此處因為沒有執行權限
[root@yanwei-test1 scripts]# chmod +x test.sh
[root@yanwei-test1 scripts]# ./test.sh
I am oldboy
但是可以用source或者"."點號執行
[root@yanwei-test1 scripts]# . test.sh #請註意,這裏“.”執行,必須有空格
I am oldboy
[root@yanwei-test1 scripts]# source test.sh
I am oldboy
我們看到,給test.sh加完可執行權限就可以執行了
##2.3 使用第三種方法
現在測試第三種方法source或者“.”點號的特殊的傳遞變量值到當前shell的例子
[root@yanwei-test1 scripts]# echo ‘userdir=pwd
‘ > testsource.sh #一行的內容通常用echo編輯很方便
[root@yanwei-test1 scripts]# cat testsource.sh
userdir=pwd
[root@yanwei-test1 scripts]# sh testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
#此處為空,並沒有出現當前路徑輸出,這是為什麽呢?
根據上面例子,我們可以發現,通過sh或bash命令執行過的腳本,腳本結束後在當前shell窗口查看userdir變量的值,發現值是為空的,現在以同樣的步驟改用source執行,然後再看看userdir變量的值。
[root@yanwei-test1 scripts]# source testsource.sh
[root@yanwei-test1 scripts]# echo $userdir
/server/scripts
-
結論:通過source或“.”點號加載執行過的腳本,在腳本結束後腳本中的變量(包括函數)值在當前shell中依然存在,而sh和bash則不行。因此,在做shell腳本開發時,如果腳本中有需求引用其他腳本的內容或者配置文件時,最好用“.”點號或source在腳本開頭加載該腳本或配置文件,然後在下面的內容用可以調用source加載的腳本及文件中的變量及函數等內容。
##2.4 某互聯網公司linux運維職位實際面試筆試填空題:
已知如下命令及返回結果,請問echo $user的返回的結果為( )
[root@yanwei-test1 scripts]# echo ‘user=whoami
‘ >whoamisource.sh
[root@yanwei-test1 scripts]# cat whoamisource.sh
user=whoami
[root@yanwei-test1 scripts]# sh whoamisource.sh
[root@yanwei-test1 scripts]# echo $user答案: 1、當前用戶 2、空(無內容輸出) #這個是正確答案
shell-腳本的執行