《LINUX實戰:Linux exec和source的簡單區別》要點:
本文介紹了LINUX實戰:Linux exec和source的簡單區別,希望對您有用。如果有疑問,可以聯系我們。
Linux種exec和.(Source)都可以同樣來執行法式或者腳本,要區別二者區別,首先了解linux下的2種命令,內部命令和外部命令:
內部命令是特殊文件格局.def實現的.
外部命令是通過系統調用或者獨立法式實現的.
其次shell執行劇本的時候有兩種方式:
1、當前shell下執行
2、啟動子shell在子shell種執行
當shell啟動子shell時候,通過fork創建進程子進程,首先子進程會繼承父進程的很多屬性,而非共享,再復制了父進程數據之后,2者就基本沒有關系了,簡單表示就是 父進程屬性→子進程.fork函數和一般的函數不同,在他成功創建出子進程之后會返回兩個值,一個返回給父進程中的pid變量(值為子進程ID),一個返回給自進程中的pid變量(值為0)當然,如果fork失敗了,則只必要返回給父進程pid變量一個-1(子進程不存在).子進程確實復制了父進程的數據,叫做繼承了父進程的部分屬性,這樣一來,子進程和父進程中的變量就不是同一個變量了.
?在shell種腳本得的第一行通常是/bin/bash,這種方式便是使用subshell執行,見《shell腳本編程》p36.當shell打開一個可執行文件時,系統調用fork創建進程,用于執行程序,內核執行飛編譯程序
返回差錯"NOT excutable format file”,shell收到差錯信息啟動一個新shell(shell副本)來執行,
#!(shabang)用于奉告內核使用哪個shell來執行.
現在我們查看系統贊助文檔怎么介紹的:
source
(.):
Read?and?execute?commands?from? filename?
in
? the? current? shell
environment? and?
return
?the?
exit
?status?of?the?last?
command
?exe-
cuted?from?filename.
exec
:
If?
command
?is?specified,?it?replaces?the?shell.? No? new? process
is? created.
由此可見source執行的時候是當前shell情況下執行,執行完成后把狀態返回給當前shell.
exec執行時候會關閉當年shell進程,并且fork一個相同pid的shell進程來執行,系統調用新的exec的process來替代本來的進程執行.從表面上看沒有新的進程創建,本來進程的代碼段、數據段、堆棧都被新的process所代替.
?exec系統挪用過程
fork()執行創建一個new_process,程序執行exec系統調用,fork()執行后父子進程共享代碼段,數據空間分開,父進程copy本身的數據空間內容和上下文到子進程.采用寫時copy的策略:在創建子進程時不會不copy父進程的地址空間,共用,當子進程寫入數據時,這時候copy空間到子進程,這種策略提高效率并且執行fork()完執行exec后,子進程的數據會被新的進程代替.
?文件描寫符FD(file-descriptor)
文件在打開時候系統給每一個打開的文件分配用于維護的描述符,這通常包含系統打開文件描述符表,進程級的文件描述符表(文件操作符標志和文件句柄的引用),文件系統i-node表.(以后會單獨寫一個對內核源碼的解釋)
?exec的用法表(參考的百度)
exec cmd | 執行cmd,結束后不反回原shell |
exec <file | file內容作為exec的stdin |
exec >file | exec中內容作為stdout |
exec 3<file | file內容讀到FD3中 |
sort <&3 | FD3讀入內容被分類 |
exec 4>file | FD4中內容寫入到file |
cmd >&4 | cmd輸出重定向到FD4 |
exec 5<&4 | FD4走FD5的通道 |
exec 3<&- | 封閉FD3 |
Example:
1、使用exec cmd
[yemo@localhost?/]$?
exec
?ls
? ? ? ? ? ?#ls?替換失落當前shell進程
bin? ?dev? home? lib64? ? ? ?media? opt? ?root? ? selinux? sys? usr
boot? etc? lib? ?lost+found? mnt? ? proc? sbin srv ?tmp? var
?
?Connection?closed?by?foreign?host.? ?
#shell已經被ls替代,ls執行完成進程結束退出
?
?Disconnected?from?remote?host(cent6mini_eth0)?at?03:59:43.
?
?Type?`help'?to?learn?how?to?use?Xshell?prompt.
[c:\~]$
執行完成后關閉了shell
2、使用exec節制FD1(stdout)
[root@localhost?tmp]
#?echo?'im?lovin?it'>?echo.txt? ? ? #簡單的輸出重定向
[root@localhost?tmp]
#?echo?echo.txt
echo
.txt
[root@localhost?tmp]
#?ls?/dev/fd/
0? 1? 2? 3
[root@localhost?tmp]
#?exec?>echo.t? ? ? ? ? ? ?#把當前所有stdout定向到文件
[root@localhost?tmp]
#?ls
[root@localhost?tmp]
#?echo?"i?did?it"
[root@localhost?tmp]
#?cat?echo.txt
cat
:?
echo
.txt:?input?
file
?is?output?
file
? ? ? ? ?#打開會死循環系統掩護? ? ? ? ? ?
[root@localhost?tmp]
#?exec?>/dev/tty? ? ? ? ? ? #把stdin重新定向會屏幕(tty設備)
[root@localhost?tmp]
#?cat?echo.txt? ? ? ? ? ? ?#正常輸出內容
echo
echo
.txt
haha
netstat
pass
rc
re.txt
sed_passwd
sudoers
yum.log
i?did?it
4、創建一個FD4
[root@localhost?yemo]
#?ls?/dev/fd/
0? 1? 2? 3
[root@localhost?tmp]
#?exec?4>4.txt? ? ? ? ? ? ? ? ? ? ? ?#生成一個文件描述符fd4指向文件
[root@localhost?tmp]
#?ls?/dev/fd/? ? ? ?
0? 1? 2? 3? 4
[root@localhost?tmp]
#?echo?"i?feel?i?lose?my?heart"?>&4? ?#把流通過fd4到文件中
[root@localhost?tmp]
#?ls?>&4? ? ? ?
[root@localhost?tmp]
#?exec?4>&-? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#關閉fd4
[root@localhost?tmp]
#?cat?4.txt?
i?feel?i?lose?my?heart
4.txt
echo
echo
.txt
haha
netstat
pass
rc
re.txt
sed_passwd
sudoers
yum.log
exec創建FD4指向文件4.txt,系統創建了FD4管道,通過管道4的內容到會傳到文件4.txt中,關閉管道,不然文件占用無法打開.
本文永遠更新鏈接地址:
學習更多LINUX教程,請查看站內專欄,如果有LINUX疑問,可以加QQ交流《LINUX實戰:Linux exec和source的簡單區別》。