linux 下source、sh、bash、./執行腳本的區別


今天練習shell時,發現用bash執行和 . 執行 $0的值是不一樣的,轉載一篇文章學習一下

1、source命令用法:
  source  FileName
  作用:在當前 bash環境下讀取並執行FileName中的命令。該filename文件可以無"執行權限"
  注:該命令通常用命令“.”來替代。
  如:source .bash_profile
    . .bash_profile兩者等效。
  source(或點)命令通常用於重新執行剛修改的初始化文檔。
  source命令(從 C Shell 而來)是bash shell的內置命令。
  點命令,就是個點符號,(從Bourne Shell而來)。
  source的程序主體是bash,腳本中的$0變量的值是bash,而且由於作用於當前bash環境,腳本中set的變量將直接起效
 
2、 sh, bash的命令用法:
   sh/bash FileName
   作用:打開一個子shell來讀取並執行FileName中命令。該filename文件可以無"執行權限"
   注:運行一個shell腳本時會啟動另一個命令解釋器.
     每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
      這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
     shell腳本也可以啟動他自已的子進程.
      這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
  在ubuntu中sh只是bash的一個鏈接。
  由於是在子shell中執行,腳本設置的變量不會影響當前shell。
 
3、./的命令用法:
   ./FileName
   作用:打開一個子shell來讀取並執行FileName中命令。該filename文件需要"執行權限"
   注:運行一個shell腳本時會啟動另一個命令解釋器.
     每個shell腳本有效地運行在父shell(parent shell)的一個子進程里.
      這個父shell是指在一個控制終端或在一個xterm窗口中給你命令指示符的進程.
     shell腳本也可以啟動他自已的子進程.
      這些子shell(即子進程)使腳本並行地,有效率地地同時運行腳本內的多個子任務.
  由於是在子shell中執行,腳本設置的變量不會影響當前shell。

 

 
exec和source都屬於bash內部命令(builtins  commands),在bash下輸入man exec或man source可以查看所有的內部命令信息。

bash  shell的命令分為兩類:外部命令和內部命令。外部命令是通過系統調用或獨立的程序實現的,如sed、awk等等。內部命令是由特殊的文件格式(.def)所實現,如cd、history、exec等等。

在說明exe和source的區別之前,先說明一下fork的概念。

fork是linux的系統調用,用來創建子進程(child process)。子進程是父進程(parent  process)的一個副本,從父進程那里獲得一定的資源分配以及繼承父進程的環境。子進程與父進程唯一不同的地方在於pid(process id)。

環境變量(傳給子進程的變量,遺傳性是本地變量和環境變量的根本區別)只能單向從父進程傳給子進程。不管子進程的環境變量如何變化,都不會影響父進程的環境變量。


shell script:

有兩種方法執行shell scripts,一種是新產生一個shell,然后執行相應的shell  scripts;一種是在當前shell下執行,不再啟用其他shell。
新產生一個shell然后再執行scripts的方法是在scripts文件開頭加入以下語句
#!/bin/sh
一般的script文件(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子進程),然后在其下執行命令。
另外一種方法就是上面說過的source命令,不再產生新的shell,而在當前shell下執行一切命令。

 

source:

source命令即點(.)命令。

在bash下輸入man source,找到source命令解釋處,可以看到解釋"Read and execute commands from  filename in the current shell environment and  ..."。從中可以知道,source命令是在當前進程中執行參數文件中的各個命令,而不是另起子進程(或sub-shell)。


exec:

在bash下輸入man exec,找到exec命令解釋處,可以看到有"No new process is  created."這樣的解釋,這就是說exec命令不產生新的子進程。那么exec與source的區別是什么呢?

exec命令在執行時會把當前的shell  process關閉,然后換到后面的命令繼續執行。

 

 

* fork ( /directory/script.sh)
    fork是最普通的,  就是直接在腳本里面用/directory/script.sh來調用script.sh這個腳本.運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候,  parent-shell還在。sub-shell執行完畢后返回parent-shell.  sub-shell從parent-shell繼承環境變量.但是sub-shell中的環境變量不會帶回parent-shell
* source  (source /directory/script.sh)
    與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行. 所以被調用的腳本中聲明的變量和環境變量,  都可以在主腳本中得到和使用.
* exec (exec /directory/script.sh)
     exec與fork不同,不需要新開一個sub-shell來執行被調用的腳本. 被調用的腳本與父腳本在同一個shell內執行。但是使用exec調用一個新腳本以后,  父腳本中exec行之后的內容就不會再執行了。這是exec和source的區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM