Linux學習筆記(20)linux exec

2022-02-14 11:22:20 字數 2944 閱讀 2338

exec命令

作用exec ls

在shell中執行ls,ls結束後不返回原來的shell中了

exec 

將file中的內容作為exec的標準輸入

exec >file

將file中的內容作為標準寫出

exec 3

將file讀入到fd3中

sort <&3

fd3中讀入的內容被分類

exec 4>file

將寫入fd4中的內容寫入file中

ls >&4

ls將不會有顯示,直接寫入fd4中了,即上面的file中

exec 5<&4

建立fd4的拷貝fd5

exec 3<&-

關閉fd3

有兩種方法執行shell scripts,一種是新產生乙個shell,然後執行相應的shell scripts;一種是在當前shell下執行,不再啟用其他shell。

新產生乙個shell然後再執行scripts的方法是在scripts檔案開頭加入以下語句

#!/bin/sh

一般的script檔案(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子程序),然後在其下執行命令。

另外一種方法就是上面說過的source命令,不再產生新的shell,而在當前shell下執行一切命令。

在bash下輸入man exec,找到exec命令解釋處,可以看到有」no new process is created.」這樣的解釋,這就是說exec命令不產生新的子程序。系統呼叫exec是以新的程序去代替原來的程序,但程序的pid保持不變。因此,可以這樣認為,exec系統呼叫並沒有建立新的程序,只是替換了原來程序上下文的內容。原程序的**段,資料段,堆疊段被新的程序所代替。

乙個程序主要包括以下幾個方面的內容:

(1)乙個可以執行的程式

(2) 與程序相關聯的全部資料(包括變數,記憶體,緩衝區)

(3)程式上下文(程式計數器pc,儲存程式執行的位置)

exec是乙個函式簇,由6個函式組成,分別是以excl和execv打頭的。

執行exec系統呼叫,一般都是這樣,用fork()函式新建立乙個程序,然後讓程序去執行exec呼叫。我們知道,在fork()建立新程序之後,父進各與子程序共享**段,但資料空間是分開的,但父程序會把自己資料空間的內容copy到子程序中去,還有上下文也會copy到子程序中去。而為了提高效率,採用一種寫時copy的策略,即建立子程序的時候,並不copy父程序的位址空間,父子程序擁有共同的位址空間,只有當子程序需要寫入資料時(如向緩衝區寫入資料),這時候會複製位址空間,複製緩衝區到子程序中去。從而父子程序擁有獨立的位址空間。而對於fork()之後執行exec後,這種策略能夠很好的提高效率,如果一開始就copy,那麼exec之後,子程序的資料會被放棄,被新的程序所代替。

a、 i/o重定向通常與 fd有關,shell的fd通常為10個,即 0~9;

b、 常用fd有3個,為0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出),預設與keyboard、monitor、monitor有關;

c、 用 > 來改變送出的資料通道(stdout, stderr),使之輸出到指定的檔案;

e、 在io重定向 中,stdout 與 stderr 的管道會先準備好,才會從 stdin 讀進資料;

g、 exec 命令:常用來替代當前 shell 並重新啟動乙個 shell,換句話說,並沒有啟動子 shell。使用這一命令時任何現有環境都將會被清除。exec 在對檔案描述符進行操作的時候,也只有在這時,exec 不會覆蓋你當前的 shell 環境。

&- 關閉標準輸出

n&- 表示將 n 號輸出關閉

上述所有形式都可以前導乙個數字,此時建立的檔案描述符由這個數字指定而不是預設的 0 或 1。如:

... 2>file 執行乙個命令並把錯誤輸出(檔案描述符 2)定向到 file。

... 2>&1 執行乙個命令並把它的標準輸出和輸出合併。(嚴格的說是通過複製檔案描述符 1 來建立檔案描述符 2 ,但效果通常是合併了兩個流。)

我們對 2>&1詳細說明一下 :2>&1 也就是 fd2=fd1 ,這裡並不是說fd2 的值 等於fd1的值,因為 > 是改變送出的資料通道,也就是說把 fd2 的 「資料輸出通道」 改為 fd1 的 「資料輸出通道」。如果僅僅這樣,這個改變好像沒有什麼作用,因為 fd2 的預設輸出和 fd1的預設輸出本來都是 monitor,一樣的!

但是,當 fd1 是其他檔案,甚至是其他 fd 時,這個就具有特殊的用途了。請大家務必理解這一點。

*** 如果關閉了stdin,因為會導致退出,那肯定不能恢復。

*** 如果重定向或關閉 stdout和stderr其中之一,可以恢復,因為他們預設均是送往monitor(但不知會否有其他影響)。如恢復重定向或關閉的 stdout: exec 1>&2 ,恢復重定向或關閉的stderr:exec 2>&1。

*** 如果stdout和stderr全部都關閉了,又沒有儲存原來的fd,可以用:exec 1>/dev/tty 恢復。

cmd >a 2>a :stdout和stderr都直接送往檔案 a ,a檔案會被開啟兩遍,由此導致stdout和stderr互相覆蓋。

cmd >a 2>&1 :stdout直接送往檔案a ,stderr是繼承了fd1的管道之後,再被送往檔案a 。a檔案只被開啟一遍,就是fd1將其開啟。

我想:他們的不同點在於:

cmd >a 2>a 相當於使用了兩個互相競爭使用檔案a的管道;

而cmd >a 2>&1 只使用了乙個管道,但在其源頭已經包括了stdout和stderr。

從io效率上來講,cmd >a 2>&1的效率應該更高!

exec 0exec 1>outfilename # 開啟檔案outfilename作為stdout

exec 2>errfilename # 開啟檔案 errfilename作為 stderr

exec 0&- # 關閉 fd1

exec 5>&- # 關閉 fd5

【參考文件】

linux學習筆記20

zip壓縮工具 zip壓縮包在windows和linux中都比較常用,他可以壓縮目錄和檔案,壓縮目錄時需要制定目錄下的檔案。zip後面先跟目標檔名,即壓縮後的自定義壓縮名,然後跟要壓縮的檔案和目錄,若你的centos沒有zip需要使用yum工具安裝 使用zip壓縮檔案 使用zip壓縮目錄。注意不管使...

Linu學習3 Linux高階命令

一 find find 查詢檔案 find 查詢檔案 注意如果沒有指定目錄,用 或者空格代替,則表示查詢當前目錄的檔案。find 可以查詢最近一段時間有改動的檔案。二 gerp 查詢字串命令 複製檔案 cp 檔案位置及檔案 新檔案位置 可用 代替後者為此資料夾。grep 目的 使用grep命令來查詢...

Linux學習筆記20 Iptables教程

iptables也叫netfilter是linux下自帶的一款免費且優秀的基於包過濾的防火牆工具,它的功能十分強大,使用非常靈活,可以對流入 流出 流經伺服器的資料報進行精細的控制。iptables是linux2.4及2.6核心中整合的模組。1.檢視iptables狀態 service iptabl...