1. 程式人生 > >Linux系統exec命令

Linux系統exec命令

shell 中的 exec 兩種用法:

1.exec 命令 ;命令代替shell程式,命令退出,shell 退出;比如 exec ls

2.exec 檔案重定向,可以將檔案的重定向就看為是shell程式的檔案重定向 比如 exec 5</dev/null;exec 5<&-

=============================

shell的內建命令exec將並不啟動新的shell,而是用要被執行命令替換當前的shell程序,並且將老程序的環境清理掉,而且exec命令後的其它命令將不再執行。 
因此,如果你在一個shell裡面,執行exec ls那麼,當列出了當前目錄後,這個shell就自己退出了,因為這個shell程序已被替換為僅僅執行ls命令的一個程序,執行結束自然也就退出了。為了避免這個影響我們的使用,一般將exec命令放到一個shell腳本里面,用主指令碼呼叫這個指令碼,呼叫點處可以用bash a.sh,(a.sh就是存放該命令的指令碼),這樣會為a.sh建立一個sub shell去執行,當執行到exec後,該子指令碼程序就被替換成了相應的exec的命令。 
source命令或者".",不會為指令碼新建shell,而只是將指令碼包含的命令在當前shell執行。 
不過,要注意一個例外,當exec命令來對檔案描述符操作的時候,就不會替換shell,而且操作完成後,還會繼續執行接下來的命令。 

    exec 3<&0:這個命令就是將操作符3也指向標準輸入。 


另外,這個命令還可以作為find命令的一個選項,如下所示: 
(1)在當前目錄下(包含子目錄),查詢所有txt檔案並找出含有字串"bin"的行 
find ./ -name "*.txt" -exec grep "bin" {} \; 
(2)在當前目錄下(包含子目錄),刪除所有txt檔案 
find ./ -name "*.txt" -exec rm {} \; 




先總結一個表:


exec命令                  作用
 
exec ls          在shell中執行ls,ls結束後不返回原來的shell中了
 
exec <file       將file中的內容作為exec的標準輸入
 
exec >file       將file中的內容作為標準寫出
 
exec 3<file      將file讀入到fd3中
 
sort <&3         fd3中讀入的內容被分類
 
exec 4>file      將寫入fd4中的內容寫入file中
 
ls >&4           Ls將不會有顯示,直接寫入fd4中了,即上面的file中
 
exec 5<&4         建立fd4的拷貝fd5
 
exec 3<&-         關閉fd3
 


 


1. exec 執行程式


 雖然exec和source都是在父程序中直接執行,但exec這個與source有很大的區別,source是執行shell指令碼,而且執行後會返回以前的shell。而exec的執行不會返回以前的shell了,而是直接把以前登陸shell作為一個程式看待,在其上經行復制。


舉例說明:


[email protected]
:~/test#exec ls


exp1  exp5  linux-2.6.27.54  ngis_post.sh  test  xen-3.0.1-install


<logout>


 


[email protected]:~/test#exec >text


[email protected]:~/test#ls


[email protected]:~/test#pwd


[email protected]:~/test#echo "hello"


[email protected]:~/test#exec>/dev/tty


[email protected]
:~/test#cat text 


exp1


exp5


linux-2.6.27.54


ngis_post.sh


test


text


xen-3.0.1-install


/root/test


hello


[email protected]:~/test#


Exec >text 是將當前shell的標準輸出都開啟到text檔案中


 


[email protected]:~/test#cat test


ls


Pwd


[email protected]:~/test#bash


[email protected]:~/test#exec <test


[email protected]:~/test#ls


exp1  exp5  linux-2.6.27.54  ngis_post.sh  test  text  xen-3.0.1-install


[email protected]:~/test#pwd


/root/test


[email protected]:~/test#


[email protected]:~/test#exit       #自動執行


 


2. exec的重定向


  先上我們進如/dev/fd/目錄下看一下:


[email protected]:~/test#cd /dev/fd


[email protected]:/dev/fd#ls


0  1  2  255


預設會有這四個項:0是標準輸入,預設是鍵盤。


1是標準輸出,預設是螢幕/dev/tty


2是標準錯誤,預設也是螢幕


255


當我們執行exec 3>test時:


[email protected]:/dev/fd#exec 3>/root/test/test 


[email protected]:/dev/fd#ls


0  1  2  255  3


[email protected]:/dev/fd#


看到了吧,多了個3,也就是又增加了一個裝置,這裡也可以體會下linux裝置即檔案的理念。這時候fd3就相當於一個管道了,重定向到fd3中的檔案會被寫在test中。關閉這個重定向可以用exec 3>&-。


[email protected]:/dev/fd#who >&3


[email protected]:/dev/fd#ls >&3


[email protected]:/dev/fd#exec 3>&-


[email protected]:/dev/fd#cat /root/test/te


test  text  


[email protected]:/dev/fd#cat /root/test/test 


root     tty1         2010-11-16 01:13


root     pts/0        2010-11-15 22:01 (192.168.0.1)


root     pts/2        2010-11-16 01:02 (192.168.0.1)


0


1


2


255


3


 


 


 


 


3. 應用舉例:


        exec 3<test


        while read -u 3 pkg


do


echo "$pkg"


done




. 系統呼叫exec是以新的程序去代替原來的程序,但程序的PID保持不變。因此,可以這樣認為,exec系統呼叫並沒有建立新的程序,只是替換了原來程序上下文的內容。原程序的程式碼段,資料段,堆疊段被新的程序所代替。


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


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


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


 


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


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


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


3. exec與system的區別


(1) exec是直接用新的程序去代替原來的程式執行,執行完畢之後不回到原先的程式中去。


(2) system是呼叫shell執行你的命令,system=fork+exec+waitpid,執行完畢之後,回到原先的程式中去。繼續執行下面的部分。


總之,如果你用exec呼叫,首先應該fork一個新的程序,然後exec. 而system不需要你fork新程序,已經封裝好了。


exec I/O重定向詳解及應用例項


1、 基本概念(這是理解後面的知識的前提,請務必理解)


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、 0 是  與 1> 是一樣的;


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


g、 管道“|”(pipe line):上一個命令的 stdout 接到下一個命令的 stdin;


h、 tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去;


i、 bash(ksh)執行命令的過程:分析命令-變數求值-命令替代(``和$( ))-重定向-萬用字元展開-確定路徑-執行命令;


j、 ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell,它有一點非常重要的特性是:繼承父shell的Standard input, output, and error plus any other open file descriptors。


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


2、cmd &n 使用系統呼叫 dup (2) 複製檔案描述符 n 並把結果用作標準輸出


&- 關閉標準輸出


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 時,這個就具有特殊的用途了。請大家務必理解這一點。


3、 如果 stdin, stdout, stderr 進行了重定向或關閉, 但沒有儲存原來的 FD, 可以將其恢復到 default 狀態嗎?


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


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


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


4、 cmd >a 2>a 和 cmd >a 2>&1 為什麼不同?


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




1.查詢所有保護字串“Hello”的檔案


find / -exec grep "Hello" {} \;


2.刪除所有臨時檔案


find / -name "*.tmp" -exec rm -f {} \;


3 刪除20天以前的檔案


find / -name "*" -ctime +20 -exec rm -f {} \; (不要執行哦,要看清楚哈)


注:+20 表示20天以前






本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連結:http://www.linuxidc.com/Linux/2011-01/31400p3.htm
本篇文章來源於 Linux公社網站(www.linuxidc.com)  原文連結:http://www.linuxidc.com/Linux/2011-01/31400p2.htm 

相關推薦

Linux系統exec命令

shell 中的 exec 兩種用法: 1.exec 命令 ;命令代替shell程式,命令退出,shell 退出;比如 exec ls 2.exec 檔案重定向,可以將檔案的重定向就看為是shell程式的檔案重定向 比如 exec 5</dev/null;exe

Linux系統常用命令

所有 目錄 span txt spa png oot http style   首先利用虛擬機安裝Linux系統,在應用程序中找到終端(很重要,因為Linux系統都是以命令的方式執行任務,而所有的命令都要在終端中輸入並且執行),然後輸入命令 1.切換用戶,普通用戶前面顯示$

linux系統常用命令 -設置文件夾讀寫權限

ima 所有 執行 權限 描述 分享 linux com bsp 設置文件夾的讀寫權限: sudo chmod -R 777 /data 權限碼描述 sudo chmod 600 ××× (只有所有者有讀和寫的權限)sudo chmod 644 ××× (所有者有讀和寫的權

Linux系統基本命令使用

切換 ssh 引號 隱藏 inux start 強制 目錄 use ssh 用戶名@ip地址  Xshell登陸 useradd 用戶名  添加用戶 su - 用戶名  跳轉到用戶名目錄下 [[email protected] ~]# 當前登錄用戶@主機名

Linux系統管理員命令:sudo

可能 優秀 外殼 aca blank su- 錯誤 方式 參數 sudo是個統管一切的命令。它的字面意思是代表“超級用戶才能做!”(super user do!)對Linux系統管理員或高級用戶而言,它是必不可少的最重要的命令之一。你可曾有過這樣的經歷:在終端中試著運行某個

Linux系統壓縮命令匯總

name lena bz2 bzip zip2 com pre 解壓 kernel 01-.tar格式解包:[*******]$ tar xvf FileName.tar打包:[*******]$ tar cvf FileName.tar DirName(註:tar是打包,

linux系統常用命令(一)

shu 解析 txt 相關 name roc upd less 位置 管理 在UNIX/linux系統中,一切皆為文件;若非文件,則為進程。首先認識文件系統: linux文件系統 /var - 經常變化的(variable)文件,諸如日誌或數據庫等 /usr - 包含絕大部

Linux系統獲取命令幫助方法及簡單命令介紹

系統 運維 Linux系統中的命令一般分兩種:內部命令和外部命令 1.內部命令:內部命令又稱為內置命令,在系統啟動時就調入內存,是常駐內存的,所以執行效率較高。 2.外部命令:外部命令是系統的軟件功能,用戶需要時才從硬盤中讀入內存。區分內部命令和外部命令的方法:type命令

Linux系統常用命令及其使用方法

系統 運維 1.echo (printf) echo - display a line of text - 顯示一行文本 常用選項: -n:不換行; -e:使 "\"生效;(eg:\n:換行,\t:水平制表符)

Linux系統命令別名功能

結果 命令使用 dev gnome 當前 then linux系統 works 可能 在管理和維護Linux系統的過程中,將會使用到大量命令,有一些很長的命令或用法經常被用到,重復而頻繁地輸入某個很長命令或用法是不可取的。這時可以使用命令別名功能將這個過程簡單化。 1.系統

03-Linux系統基礎命令

Linux系統基礎命令系統目錄結構 /root 這是系統管理員(root user)的目錄。 /bin 這裏存放了標準的(或者說是缺省的)linux的工具,比如像“ls”、“vi”還有“more”等等。 /etc 系統重要配置文件, 以及常用服務配置文件 /var

linux系統常用命令統計及shell特殊字符

命令 輸入 grep命令 err name 信息 通配符 輸出 鏈接 shell 特殊字符:1.通配符2.管道 1.通配符 1.1星號(*):匹配任意長度 1.2問號(?):匹配一個長度的字符 1.3方括號([......]):匹配其中指定的字符 1.4方括號([-]):匹

Linux系統命令的使用格式

清空 strong src show sof format sun shell ... 簡述:   在學習Linux系統時,必不可少的要接觸命令的使用方法和格式,下面通過詳細介紹ifconfig、echo、tty、startx、export、pwd、history、shut

Linux系統常用命令--LInix系統隨筆(四)

不完全 apropos 軟鏈接文件 chown 技術分享 ctrl+d log 常用選項 exec 前言:雖然一直在用linux但是一直沒有系統的學習過,趁著暑假花了幾天看著鳥哥的書學習了一下。下面是我記錄的一些筆記,本人屬於入門的小白所以難免有不足之處,還望發現的表哥

Linux系統history命令小技巧

有助於 oca etc proc 哪些 執行 hist 使用 設置環境變量 背景 Linux系統中的history命令可以查看在系統中執行過哪些命令,在系統被***後,可以查看系統中執行過哪命令,有助於分析相關問題。 知識點 在Linux系統執行history #histo

Linux系統——sed命令

ont grep 小文件 定時 eth chkconfig 定時任務 情況 讀取 sed命令精講 cat工作原理 cat命令只想文件,把文件打開後,將文件中所有內容一次性讀到內存中,從內存裏一次性輸出到屏幕上,此時可能存在內存裝不下的情況,因此cat命令只能查看小文件內容

linux系統awk命令精解

pri inux ger 進行 sed 文本 系統命令 切割 文件切割 AWK是一種處理文本文件的語言,是一個強大的文本分析工具。 之所以叫AWK是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Fami

Linux系統基礎命令總結

一、幫助命令(1)helpxxxx --helphelp xxxx(2)manman xxxx二、ls檢視命令:列表顯示目錄內的檔案及目錄ls 引數-l 以列表的形式顯示-d 顯示目錄本身屬性-a顯示所有子目錄和檔案資訊-R以遞迴的方式顯示目錄及其子目錄中的所有內容三、touch命令:建立空檔案touch 檔

Linux系統——date命令

date命令 作用:用來顯示或設定系統的日期與時間。   引數 -d<字串>:顯示字串所指的日期與時間。字串前後必須加上雙引號; -s<字串>:根據字串來設定日期與時間。字串前後必須加上雙引號; -u:顯示GMT; --help:線上幫助; --version

Linux系統touch命令改變檔案的建立時間

使用touch命令:將檔案的時間修改為2013年1月21日19點25分 touch -c -m -t 201301211925 version.dat 前提是必須有這個檔案。 解釋說明: -c表示不建立檔案  --no-create    do