Linux下shell與子shell及執行Script的幾種方式

Linux登陸主機後,在執行Script之前,其實我們已經處於一個shell中,即Login shell。它是將來要執行Script的父shell。如root賬號默認爲/bin/bash。
     Linux下每個賬號都可以自定義Login shell,在/etc/passwd文件中。Login shell定義在第七個字段,如果這個字段的shell程序不存在、不合法,或執行失敗,則無法登陸主機。
     當在執行一個Shell Script時,父shell會根據Script程序的第一行#!之後指定的shell程序開啓一個子shell環境,然後在子shell中執行此Shell Script,一旦執行完畢,子shell結束,回到父shell,不會影響原父shell的環境。

Linux執行Script有三種執行方式:
1.source filename 或者 . filename
  注意. Filename中,. 和filename之間有個空格。
  此命令式在當前shell環境下讀取並執行filename中的命令。該filename文件可以無執行權限。通常用於重新執行剛修改的初始化文檔。source命令(從 C Shell 而來)是bash shell的內置命令。 點命令,就是個點符號,(從Bourne Shell而來),就是順序的執行文件裏的命令而已。
2.sh filename 或者 bash filename
  此命令是在當前相應的bash環境下新建一個子shell讀取並執行FileName中的命令,該filename文件可以無執行權限。
3.  ./filename
  此命令打開一個子shell來讀取並執行filename中命令,該文件必須必須有可執行的權限。chmod +x filename。
三者的區別:
1.當shell腳本具有可執行權限時,用sh filename與./filename執行腳本是沒有區別得。./filename是因爲當前目錄沒有在PATH中,所有"."是用來表示當前目錄的。
2.sh filename 重新建立一個子shell,在子shell中執行腳本里面的語句,該子shell繼承父shell的環境變量,但子shell新建的、改變的變量不會被帶回父shell,除非使用export。
3.source filename:這個命令其實只是簡單地讀取腳本里面的語句依次在當前shell裏面執行,沒有建立新的子shell。那麼腳本里面所有新建、改變變量的語句都會保存在當前shell裏面。
舉例:
1.新建一個test.sh腳本,內容爲:A=1。
2.然後使其可執行chmod +x test.sh。
3.運行sh test.sh後,echo $A,顯示爲空,因爲A=1並未傳回給當前shell。
4.運行./test.sh後,也是一樣的效果。
5.運行source test.sh 或者 . test.sh,然後echo $A,則會顯示1,說明A=1的變量在當前shell 中。
舉例:
1.新建一個sh01.sh腳本,內容爲
#!/bin/bash
echo $SHLVL  (輸出當前shell的層次)
2.然後使其可執行chmod +x sh01.sh。
3.運行sh sh01.sh後,輸出3。
4.運行./ sh01.sh後,也是一樣的效果。
5.運行source sh01.sh 或者 . sh01.sh,輸出2。
舉例:
1.登錄主機後,打開一個終端,輸入echo $SHLVL,輸出2。
2.輸入bash,進入一個子shell,然後再輸入echo $SHLVL,輸出3。
3.輸入exit,然後再輸入echo $SHLVL,輸出2。
4.輸入exit,退出終端。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章