fork source exec区别差异
生活随笔
收集整理的這篇文章主要介紹了
fork source exec区别差异
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
fork? ?使用 fork 方式運(yùn)行 script 時(shí), 就是讓 shell(parent process) 產(chǎn)生一個(gè) child? ?process 去執(zhí)行該 script, 當(dāng) child process 結(jié)束后, 會(huì)返回 parent process,? ?但 parent process 的環(huán)境是不會(huì)因 child process 的改變而改變的. source? ?使用 source 方式運(yùn)行 script 時(shí), 就是讓 script 在當(dāng)前 process 內(nèi)執(zhí)行, 而不? ?是產(chǎn)生一個(gè) child process 來執(zhí)行. 由于所有執(zhí)行結(jié)果均于當(dāng)前 process 內(nèi)完成,? ?若 script 的環(huán)境有所改變, 當(dāng)然也會(huì)改變當(dāng)前 process 環(huán)境了. exec? ?使用 exec 方式運(yùn)行script時(shí), 它和 source 一樣, 也是讓 script 在當(dāng)前process? ?內(nèi)執(zhí)行, 但是 process 內(nèi)的原代碼剩下部分將被終止. 同樣, process 內(nèi)的環(huán)境隨? ?script 改變而改變.
結(jié)論:通常如果我們執(zhí)行時(shí),都是默認(rèn)為fork的。大家可以通過pstree命令看看關(guān)于父子進(jìn)程的關(guān)系。如上,如果想讓父進(jìn)程得到子進(jìn)程的環(huán)境變量,就是source方式了?
? ???* fork ( /directory/script.sh)
? ???fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調(diào)用script.sh這個(gè)腳本.
? ???運(yùn)行的時(shí)候開一個(gè)sub-shell執(zhí)行調(diào)用的腳本,sub-shell執(zhí)行的時(shí)候, parent-shell還在。
? ???sub-shell執(zhí)行完畢后返回parent-shell. sub-shell從parent-shell繼承環(huán)境變量.但是sub-shell中的環(huán)境變量不會(huì)帶回parent-shell
? ???*
? ?? ?exec (exec /directory/script.sh)
? ???exec與fork不同,不需要新開一個(gè)sub-shell來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個(gè)shell內(nèi)執(zhí)行。但是使用exec調(diào)用一個(gè)新腳本以后, 父腳本中exec行之后的內(nèi)容就不會(huì)再執(zhí)行了。這是exec和source的區(qū)別
? ???*
? ?? ?source (source /directory/script.sh)
? ???與fork的區(qū)別是不新開一個(gè)sub-shell來執(zhí)行被調(diào)用的腳本,而是在同一個(gè)shell中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中得到和使用.
可以通過下面這兩個(gè)腳本來體會(huì)三種調(diào)用方式的不同:
1.sh?
? ???#!/bin/bash
? ???A=B
? ? echo " ID for 1.sh before exec/source/fork $"
? ? export A
? ? echo "1.sh: \$A is $A"
? ? case $1 in
? ?? ?? ?? ?exec)
? ?? ?? ?? ?? ?? ???echo "using exec…"
? ?? ?? ?? ?? ?? ???exec ./2.sh ;;
? ?? ?? ?? ?source)
? ?? ?? ?? ?? ?? ???echo "using source…"
? ?? ?? ?? ?? ?? ???. ./2.sh ;;
? ?? ?? ?? ?*)
? ?? ?? ?? ?? ?? ???echo "using fork by default…"
? ?? ?? ?? ?? ?? ???./2.sh ;;
? ? esac
? ? echo " ID for 1.sh after exec/source/fork $"
? ? echo "1.sh: \$A is $A"
2.sh?
? ???#!/bin/bash
? ???echo " ID for 2.sh: $$"
? ? echo "2.sh get \$A=$A from 1.sh"
? ? A=C
? ? export A
? ? echo "2.sh: \$A is $A"
? ?? ?
? ?? ?
? ???執(zhí)行情況:
? ???$ ./1.sh?
? ? PID for 1.sh before exec/source/fork:5845364
? ? 1.sh: $A is B
? ? using fork by default…
? ? PID for 2.sh: 5242940
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? PID for 1.sh after exec/source/fork:5845364
? ? 1.sh: $A is B
? ? $ ./1.sh exec
? ? PID for 1.sh before exec/source/fork:5562668
? ? 1.sh: $A is B
? ? using exec…
? ? PID for 2.sh: 5562668
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? $ ./1.sh source
? ? PID for 1.sh before exec/source/fork:5156894
? ? 1.sh: $A is B
? ? using source…
? ? PID for 2.sh: 5156894
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? PID for 1.sh after exec/source/fork:5156894
? ? 1.sh: $A is C
? ? $
? ???* fork ( /directory/script.sh)
? ???fork是最普通的, 就是直接在腳本里面用/directory/script.sh來調(diào)用script.sh這個(gè)腳本.
? ???運(yùn)行的時(shí)候開一個(gè)sub-shell執(zhí)行調(diào)用的腳本,sub-shell執(zhí)行的時(shí)候, parent-shell還在。
? ???sub-shell執(zhí)行完畢后返回parent-shell. sub-shell從parent-shell繼承環(huán)境變量.但是sub-shell中的環(huán)境變量不會(huì)帶回parent-shell
? ???*
? ?? ?exec (exec /directory/script.sh)
? ???exec與fork不同,不需要新開一個(gè)sub-shell來執(zhí)行被調(diào)用的腳本. 被調(diào)用的腳本與父腳本在同一個(gè)shell內(nèi)執(zhí)行。但是使用exec調(diào)用一個(gè)新腳本以后, 父腳本中exec行之后的內(nèi)容就不會(huì)再執(zhí)行了。這是exec和source的區(qū)別
? ???*
? ?? ?source (source /directory/script.sh)
? ???與fork的區(qū)別是不新開一個(gè)sub-shell來執(zhí)行被調(diào)用的腳本,而是在同一個(gè)shell中執(zhí)行. 所以被調(diào)用的腳本中聲明的變量和環(huán)境變量, 都可以在主腳本中得到和使用.
可以通過下面這兩個(gè)腳本來體會(huì)三種調(diào)用方式的不同:
1.sh?
? ???#!/bin/bash
? ???A=B
? ? echo " ID for 1.sh before exec/source/fork $"
? ? export A
? ? echo "1.sh: \$A is $A"
? ? case $1 in
? ?? ?? ?? ?exec)
? ?? ?? ?? ?? ?? ???echo "using exec…"
? ?? ?? ?? ?? ?? ???exec ./2.sh ;;
? ?? ?? ?? ?source)
? ?? ?? ?? ?? ?? ???echo "using source…"
? ?? ?? ?? ?? ?? ???. ./2.sh ;;
? ?? ?? ?? ?*)
? ?? ?? ?? ?? ?? ???echo "using fork by default…"
? ?? ?? ?? ?? ?? ???./2.sh ;;
? ? esac
? ? echo " ID for 1.sh after exec/source/fork $"
? ? echo "1.sh: \$A is $A"
2.sh?
? ???#!/bin/bash
? ???echo " ID for 2.sh: $$"
? ? echo "2.sh get \$A=$A from 1.sh"
? ? A=C
? ? export A
? ? echo "2.sh: \$A is $A"
? ?? ?
? ?? ?
? ???執(zhí)行情況:
? ???$ ./1.sh?
? ? PID for 1.sh before exec/source/fork:5845364
? ? 1.sh: $A is B
? ? using fork by default…
? ? PID for 2.sh: 5242940
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? PID for 1.sh after exec/source/fork:5845364
? ? 1.sh: $A is B
? ? $ ./1.sh exec
? ? PID for 1.sh before exec/source/fork:5562668
? ? 1.sh: $A is B
? ? using exec…
? ? PID for 2.sh: 5562668
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? $ ./1.sh source
? ? PID for 1.sh before exec/source/fork:5156894
? ? 1.sh: $A is B
? ? using source…
? ? PID for 2.sh: 5156894
? ? 2.sh get $A=B from 1.sh
? ? 2.sh: $A is C
? ? PID for 1.sh after exec/source/fork:5156894
? ? 1.sh: $A is C
? ? $
總結(jié)
以上是生活随笔為你收集整理的fork source exec区别差异的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统调用过程分析
- 下一篇: 1.6.4 分离原则: 策略同机制分离,