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...