exec 是 bash 的內(nèi)置命令
shell 的內(nèi)件命令exec執(zhí)行命令時(shí),不啟用新的shell進(jìn)程。
source 和 .?不啟用新的shell,在當(dāng)前shell中執(zhí)行,設(shè)定的局部變量在執(zhí)行完命令后仍然有效。
bash 或 sh 或 shell script 執(zhí)行時(shí),另起一個(gè)子shell,其繼承父shell的環(huán)境變量,其子shelll的變量執(zhí)行完后不影響父shell。
exec是用被執(zhí)行的命令行替換掉當(dāng)前的shell進(jìn)程,且exec命令后的其他命令將不再執(zhí)行。
例如在當(dāng)前shell中執(zhí)行 exec ls ?表示執(zhí)行l(wèi)s這條命令來替換當(dāng)前的shell ,即為執(zhí)行完后會(huì)退出當(dāng)前shell。
為了避免這個(gè)結(jié)果的影響,一般將exec命令放到一個(gè)shell腳本中,用主腳本調(diào)用這個(gè)腳本,調(diào)用處可以用bash? xx.sh(xx.sh為存放exec命令的腳本),這樣會(huì)為xx.sh建立一個(gè)子shell去執(zhí)行,當(dāng)執(zhí)行exec后該子腳本進(jìn)程就被替換成相應(yīng)的exec的命令。
其中有一個(gè)例外:當(dāng)exec命令對(duì)文件描述符操作的時(shí)候,就不會(huì)替換shell,而是操作完成后還會(huì)繼續(xù)執(zhí)行后面的命令!
在shell腳本中使用exec命令,根據(jù)操作的對(duì)象不同會(huì)有不同的行為
文件描述符
shell中描述符一共有12個(gè)
0 ?代表標(biāo)準(zhǔn)輸入
1 ?代表標(biāo)準(zhǔn)輸出
2 ?錯(cuò)誤輸出
其他 3-9 都是空白描述符
# ?exec3>&1?4>&2?1>>?bash.log?2>&1
其含義是: 復(fù)制標(biāo)準(zhǔn)輸出到3 ,錯(cuò)誤輸出到 4 ,把 3 4 保存在bash.log 這個(gè)文件中。
# ?./bash.sh ?>> bash.log ? 2>&1
其含義是:將bash.sh腳本執(zhí)行的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出追加重定向到 bash.log
如果exec 跟的是其他命令,則其他命令結(jié)束后,本shell也隨之停止
# ?cat test_exec.sh
###################
#!/bin/bash ?
#?
echo "Hello mysql" ?
exec echo "Hello oracle" ?
echo "Hello sqlserver"
####################

可以看到隨著 echo " hello oracle" ?這條指令運(yùn)行完本 整個(gè)腳本執(zhí)行完畢,后面的 echo " hello db2" 沒有執(zhí)行!
Linux shell 腳本中, $@ 和$# 分別是什么意思?
$@ ?表示所有腳本參數(shù)的內(nèi)容
$# 表示返回所有腳本參數(shù)的個(gè)數(shù)
示例:編寫如下shell腳本,保存為test.sh
###############
#!/bin/sh
echo "number:$#"
echo "argume:$@"
###############
執(zhí)行腳本:
./test.sh?first_arg ?second_arg

說明:給腳本提供了兩個(gè)參數(shù),所以$#輸出的結(jié)果是2,$@代表了參數(shù)的內(nèi)容!
怎么理解shell腳本中 ?exec?"`dirname "$0"`/node""$0" ?"$@" ?
$0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? # 腳本自己的路徑
"`dirname "$0"`"/node ? ?# 腳本目錄下的node程序的路徑
$@ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 腳本被執(zhí)行時(shí)的命令行參數(shù)
合起來就是:用腳本目錄下的node程序來解釋這個(gè)腳本本身
exec scala "$0" "$@"是什么意思
這是bash語法。
$0 ?表示當(dāng)前腳本的名字
$@ ?表示當(dāng)前腳本執(zhí)行的所有參數(shù)
exec scala "$0" "$@" ? ?表示用scala命令,帶參數(shù),執(zhí)行當(dāng)前腳本
exec ?sh "$0 ?在這個(gè)文件里,exec sh ?$0是什么意思?
############
#!/bin/sh
echo ?"Hello!"
sleep 2
execsh?"$0"
#############
$0 ? 是位置參數(shù),表示腳本名稱
$1 ? 表示腳本的第一個(gè)參數(shù),依次類推直到$9
exec用于執(zhí)行命令、或腳本、或外部可執(zhí)行程序,會(huì)新建一個(gè)shell去執(zhí)行
綜上,這里exec sh ?"$0" ?就是執(zhí)行腳本本身
所以,就是一個(gè)循環(huán)過程,每隔兩秒打印一次 Hello

#############
#!/bin/sh
echo ?"Hello!"
sleep 2
exec ??"$0"
#############
