執行shell指令碼的三種不同情況

2021-05-23 00:36:52 字數 1762 閱讀 9790

shell 指令碼執行是乙個很有意思的事情,有三種不同的基本情況。這也是linux系統靈活性的一種體現。在我開始做lfs之前,我只會做一種shell指令碼的執行 方式。那就是在當前目錄下 ./shell-script.sh。哈哈,最近看了一些文章的解釋之後,發現我真是太土了。

以前看過一些linux programming的書,知道fork的概念。fork是一種主要的linux建立子程序的方式。fork被呼叫之後,會建立乙個子程序,該子程序繼承了父程序的環境變數,但是它只是父程序的拷貝,它的修改並不會影響父程序的環境變數。

我最早會用的./shell-script.sh其實就是fork的方式去執行乙個程式(這個程式就是shell指令碼)。所以這個新的shell指令碼在執行時擁有父程序的乙個環境變數表的拷貝。所以我們知道了,這種預設的shell指令碼執行是會建立出新的程序的。

而另外還有兩種用法,是不會建立出子程序的,那就是source和exec。

和fork方式不同,source和exec則都會在當前的程序內去執行相應的程式。所以就不存在環境變數的拷貝問題,該shell指令碼的執行直接會影響 到當前的環境變數表。而且exec還有個特別之處就是,當它執行的程式完成之後,所在的程序也會退出。比如在gnome的terminal中用exec command之後,當前的terminal就會退出,這個有時候還很有用。source還有乙個很有趣的縮寫,也就是乙個點。比如. ./shell-script.sh,是不是很奇怪。

總結一下

new process            terminate current/parent

fork                   y                                    n

source             n                                    n

exec                 n                                    y

假設指令碼為a.sh,則要執行該指令碼,有以下方式

1 給指令碼加上執行許可權chmod u+x a.sh, 而後就可以直接用全路徑來執行指令碼了,比如當前資料夾下用./a.sh, 如果指令碼所在目錄在path環境變數之中, 則直接用a.sh即可

2 sh/bash a.sh的路徑,這種情況不需要指令碼具有執行許可權.

以上兩種情況中,指令碼中$0都是a.sh,都是在shell的子程序中執行的.

3 source a.sh的路徑

4 . a.sh的路徑

以上兩種情況都是指令碼在當前shell的程序中執行,所以$0都是bash/sh, 區別在於, source不是posix shell的內建命令,所以3在sh中實際上是不能執行的,在bash中可以. 而.則無論在bash還是posix shell中都是可以用來載入並執行指令碼. 所以, 相對而言, 應該是4 更加具有移植性.

有個指令碼內容如下:

#!/bin/sh

export aaa="bbb"

執行方法:

1, sh jiaoben.sh

2, ./jiaoben.sh

3, . jiaoben.sh

解釋:1, 作業系統啟動程式sh, sh發現了乙個引數jiaoben.sh,並把檔案jiaoben.sh作為指令碼執行.

2, 作業系統啟動這個程式,然後發現是個指令碼而不是二進位制的程式,然後又發現這個指令碼要用/bin/sh 執行(通過#!發現的),然後作業系統交給/bin/sh執行下面的命令列.

3, 在當前環境下執行指令碼.所有的環境變數的修改都會在當前環境下生效,而1,2,指令碼退出後,環境變數不變.

shell指令碼的三種執行方式

執行shell指令碼的三種方式有 1.sh test.sh 2.test.sh 3.source test.sh or test.sh 對於test.sh指令碼來說,如果沒有執行許可權或者沒有在檔案開頭指定直譯器,那麼只能使用第一種執行方式,除此之外,他們沒有什麼差別 但是對於第三種執行方式來說,它...

Shell指令碼執行的三種方式

參考 bash script name或sh script namepath script name或.script namesource script name或.script name 1 bash script name或sh script name 這是當指令碼檔案本身沒有可執行許可權 即檔...

shell指令碼的三種呼叫方式

在執行shell指令碼時候,有三種方式來呼叫外部的指令碼,exec exec script.sh source source script.sh fork script.sh 1 exec exec home script.sh 使用exec來呼叫指令碼,被執行的指令碼會繼承當前shell的環境變數...